首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么(在MATLAB中)这段代码更快?

为什么(在MATLAB中)这段代码更快?
EN

Stack Overflow用户
提问于 2013-07-10 13:47:31
回答 2查看 161关注 0票数 5

我在MATLAB中用两种不同的方式写了一些代码。首先,我使用了两个for循环,乍一看似乎很愚蠢:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Initial = [zeros(10,1) ones(10,1)];

for xpop=1:10
    for nvar=1:10
        Parent(xpop,nvar) = Initial(nvar,1)+(Initial(nvar,2)-Initial(nvar,1))*rand();
    end
end

在第二种方案中,我尝试进行向量化计算(我假设它可以更快):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Parent = repmat(Initial(:,1),1,10) + rand(10,10).*(repmat(Initial(:,2),1,10)-repmat(Initial(:,1),1,10));

代码在三次不同运行中的运行时间如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Elapsed time is 0.000456 seconds.
Elapsed time is 0.006342 seconds.

Elapsed time is 0.000457 seconds.
Elapsed time is 0.006147 seconds.

Elapsed time is 0.000471 seconds.
Elapsed time is 0.006433 seconds.

为什么第一种方案比第二种方案快?它真的在'.*‘命令中做了两个愚蠢的for循环吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 14:02:30

您的测试设置太小,无法显示向量化的优势。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Initial = [zeros(10,1) ones(10,1)];
Elapsed time is 0.000078 seconds.
Elapsed time is 0.000995 seconds.

现在来看一个更大的问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Initial = [zeros(1000,1) ones(1000,1)];
Elapsed time is 2.797949 seconds.
Elapsed time is 0.049859 seconds.
票数 9
EN

Stack Overflow用户

发布于 2013-07-10 14:08:58

这对你测试这些东西是有好处的。但是,您需要学习如何进行这些测试以获得良好的信息。

首先,花费的时间非常小,所以重复测试总是最好的。第二,使用像timeit这样的工具。它为您做了所有的工作,消除了许多错误来源,尽管它需要将其目标封装为一个函数。

接下来,还有一些小问题。您的测试用例非常小。事实上,代码花费时间的原因有很多。考虑功能开销和启动成本。调用函数需要时间,因为设置和销毁函数工作区会产生开销。此外,一个好的函数将进行错误测试,并提供几个选项。但要实现这一点,它必须检查是否设置了这些选项。所以时间被浪费了,通常没有做任何有价值的事情,因为你只想以某种简单的形式使用函数。这意味着,当你调用函数来矢量化一个微小的计算时,它实际上可能比你只做内联的未矢量化的形式需要更多的时间。因此,小的测试用例往往具有误导性。(我打算为更大的问题添加一个时间比较,但那时Marc已经在他的答案中这样做了。对于更大的问题,请参阅背心差异。)

您还应该学习使用bsxfun,这是一个设计用来优化您正在测试的表单的某些计算的工具。再说一次,小问题通常不会在速度上有很大的提高。

接下来,还有JIT的问题,即在MATLAB中对一些简单代码进行优化的加速。如果这个(对你来说不可见的)工具能够很好地处理你正在测试的代码,那么它看起来就像是循环更快了。

做一些测试是很好的,所以让我们做一个比较。由于您的示例主要是内联的,因此我将在每个case周围放置一个大循环。这将减少测试错误的一个主要来源。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ktot = 100;
N = 10;
Initial = [zeros(N,1) ones(N,1)];

tic
for k = 1:Ktot
  for xpop=1:N
    for nvar=1:N
      Parent(xpop,nvar) = Initial(nvar,1)+(Initial(nvar,2)-Initial(nvar,1))*rand();
    end
  end
end
toc

tic
for k = 1:Ktot
  Parent = repmat(Initial(:,1),1,N) + rand(N,N).*(repmat(Initial(:,2),1,N)-repmat(Initial(:,1),1,N));
end
toc

你能改进你的矢量化形式吗?当一个可以工作时,为什么要做两个repmats?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tic
for k = 1:Ktot
  Parent = repmat(Initial(:,1),1,N) + rand(N,N).*repmat(Initial(:,2)-Initial(:,1),1,N);
end
toc

那bsxfun呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tic
for k = 1:Ktot
  Parent = bsxfun(@plus,Initial(:,1),bsxfun(@times,rand(N,N),Initial(:,2)-Initial(:,1)));
end
toc

因此,当N= 10,Ktot = 100时,我看到这样的时间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Elapsed time is 0.003935 seconds.
Elapsed time is 0.012250 seconds.
Elapsed time is 0.008269 seconds.
Elapsed time is 0.004304 seconds.

再说一次,这是一个小问题。如果我们扩大问题会发生什么?尝试N= 100,而不是N= 10。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Elapsed time is 0.131186 seconds.
Elapsed time is 0.031671 seconds.
Elapsed time is 0.027205 seconds.
Elapsed time is 0.019763 seconds.

因此,我们看到了一些更符合逻辑的事情。现在,bsxfun的变体开始显示出一些好处。接下来,上升到N= 1000。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Elapsed time is 12.288608 seconds.
Elapsed time is 3.412531 seconds.
Elapsed time is 2.690691 seconds.
Elapsed time is 1.626599 seconds.

本质上,所有这些代码都做相同的工作,只是其中一些在如何构建问题方面更有效,而另一些则有更多开销。正如我们在更大的问题中所看到的,显式循环是平坦的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17572332

复制
相关文章
使用Python计算非参数的秩相关
当两个变量都有良好理解的高斯分布时,很容易计算和解释。而当我们不知道变量的分布时,我们必须使用非参数的秩相关(Rank Correlation,或称为等级相关)方法。
AiTechYun
2018/07/27
2.7K0
使用Python计算非参数的秩相关
分而治之
给定K个整数组成的序列{ N ​1​​ , N​2​​ , …, N​K },“连续子列”被定义为{ N​i , N​i+1​​ , …, N​j },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
废江_小江
2022/09/05
3470
分而治之
matlab中矩阵的秩,matlab矩阵的秩
如下所示为一方阵 在 matlab 输入矩阵: A = [1 2 4; 407 9 1 3]; 2. 2 查阅 matlab help 可以知道,利用 eig 函数可以快速求解矩阵的特征值与特 征……
全栈程序员站长
2022/09/02
1.1K0
各怀心事的边缘计算玩家们
前面说过我对边缘计算的理解,认为边缘计算是在一定程度上弥补传统云计算的不足,相对于传统的全集中模式的云计算中心,边缘计算节点可以在现场终端侧,也可以在终端与中心之间的任何一个位置,来改善云计算的时延、成本、性能和安全性等。
边缘计算
2019/07/03
4500
用函数计算各职级的等比薪酬
在做薪酬数据分析中,我们确定了岗位的各个职级,基于薪酬宽带的薪酬设计理论,我们需要对各个职级的薪酬再做一个薪酬的带宽,如下图
王佩军
2020/03/11
1.5K0
前端各知识点梳理(施工中...)
作用域是一套用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找的规则。
前端_AWhile
2020/05/18
2.4K0
matlab 求矩阵秩,用MATLAB编程求矩阵的秩
我明白了,就是极大无关组,我的这个程序把所有的基都写出来了,你只要选一个就可以,还对两种矩形的矩阵(例如2×3,3×2都测试了);如果谁会优化这个程序的会更好!
全栈程序员站长
2022/08/23
6980
基本算法-分而治之
第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;
赵云龙龙
2019/12/25
8280
【浅记】分而治之
树的深度通常从0开始计,故层数等于n+1,后续统一用深度 可以得到,这个算法的时间复杂度是:
WuShF
2023/10/03
3120
【浅记】分而治之
分而治之与快速排序
快速排序算法是一种常用的排序算法,比选择算法快得多,快速排序算法使用了分而治之(divide and conquer,D&C)的思想,即一种著名的递归式问题解决方法。
艰默
2023/05/17
3310
分而治之与快速排序
Python|分治(分而治之)法
分治思想自古就有,在《孙子兵法》中有这么一句话:凡治众如治寡,分数是也:斗众如斗寡,形名是也。
算法与编程之美
2021/07/09
8030
面试-Fork/Join(分而治之)框架 原
(adsbygoogle = window.adsbygoogle || []).push({});
秋日芒草
2019/03/29
4040
面试-Fork/Join(分而治之)框架
                                                                            原
云计算的拓展点
务院最新常务会议在给企业特别是小微企业送去每年减税400亿大餐的同时,更明确提出要积极支持云计算与物联网、移动互联网等融合发展,催生基于云计算的在线研发设计、教育医疗、智能制造等新业态。作为一项战略性产业,云计算被纳入了顶层设计。 云计算代表了个人计算机与互联网之后的第三次IT革命。在美国,政府专门设立了多个云计算管理机构,共同处理联邦政府云计算事务:如联邦首席信息官(CIO)委员会下设云计算执行委员会(ESC),专司联邦云计算计划(FCCI)的制定及管理;总务管理局(GSA)设立了联邦云计算项目管理办公室
静一
2018/03/20
1.8K0
C++ 求矩阵的秩
你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料? 输入描述: 第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50) 第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料. 输出描述: 输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。 输入例子: 29 4096 8192 16384 32768 65536 131072 262144 524288 1048576 16 32 64 128 256 512 1024 2048 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 999999999 1000000000 15 输出例子:
全栈程序员站长
2022/08/23
7140
Excel函数学习-计算各职务的人数
【难点】由于有兼职的人数,你可以进行筛选,但是兼职的人数就难统计了,如:“班主任”和“班主任、备课组长”就会分开统计了
哆哆Excel
2022/10/25
1K0
Excel函数学习-计算各职务的人数
计算24点
游戏规则:一副牌中抽去大小王剩下52张,任意抽取4张牌,利用四则运算(加减乘除以及括号)把牌面上的数算成24。每张牌能且只能用一次。
万木逢春
2019/04/30
3930
数据分析-非参数秩方法
非参数秩方法,即不假定总体分布的具体形式,从数据本身获得所需信息,适用范围广,但忽略了分布类型,针对性差。
唔仄lo咚锵
2022/10/04
1.1K0
数据分析-非参数秩方法
【GPLT】L2-025 分而治之
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
5210
Java之矩阵求秩
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145006.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/30
7560
Java之矩阵求秩
科普丨各编程语言就业必备知识点大全
现在IT新技术日新月异,每一种编程语言下面的技能和知识点都特别多,让我们很难判断该如何选择性和有侧重性的学习。 这个也不能根据自己的主观想法进行规划,要跟上IT环境的节奏才行。所以今天老九君给大家分享:从几百家知名企业的招聘信息中所得的技能各语言关键字出现频次排行。 统计说明: 1、数据来自企业的招聘信息,可能有些技术点过时了,但是因为历史遗留项目问题仍然还会有企业在用,大家要明白这个道理,不是最新技术就一定会被企业接受,对于企业来说,项目能正常运转,满足需求就够了,更换新技术代表增加额外成本。 2、技能表
老九君
2018/03/06
1K0
科普丨各编程语言就业必备知识点大全

相似问题

R中数据中各列的秩计算

11

计算矩阵各点之间的距离

11

快速计算各点间距离的方法

10

计算网格中各点组合之间的距离

12

试图计算.txt文件中各点之间的距离

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文