Matlab:执行速度较慢,但操作较少

Matlab:执行速度较慢,但操作较少,matlab,vectorization,Matlab,Vectorization,我对Matlab是新手。这是我的游戏剧本: 功能速度测试() a=重塑(1:1:30000,10000,3); 抽搐; 对于i=1:100 a(:,[1,2])=bsxfun(@减号,a(:,[1,2]),[1,1]); 结束 toc 抽搐; 对于i=1:100 a=bsxfun(@减号,a[1,1,0]); 结束 toc 结束 以及执行时间: 运行时间为0.007709秒。 运行时间为0.001803秒。 第一种方法操作较少,但运行速度较慢。这是矢量化问题吗?如果是这样,为什么Matlab

我对Matlab是新手。这是我的游戏剧本:

功能速度测试()
a=重塑(1:1:30000,10000,3);
抽搐;
对于i=1:100
a(:,[1,2])=bsxfun(@减号,a(:,[1,2]),[1,1]);
结束
toc
抽搐;
对于i=1:100
a=bsxfun(@减号,a[1,1,0]);
结束
toc
结束
以及执行时间:

运行时间为0.007709秒。
运行时间为0.001803秒。
第一种方法操作较少,但运行速度较慢。这是矢量化问题吗?如果是这样,为什么Matlab不能“矢量化”我的
a(:,[1,2])
选择

更新:

按照@thewaywewalk,我将代码放在单个函数中,删除循环并使用
timeit
。结果如下:

#a(:,[1,2])=bsxfun(@减号,a(:,[1,2]),[1,1]);
1.0064e-04
#a=bsxfun(@减号,a[1,1,0]);
6.4187e-05

第一种方法的开销来自子矩阵切片。改成

    tic;
    b=a(:,[1,2]);
    for i = 1:100
        b = bsxfun(@minus, b, [1, 1]);
    end
    a(:,[1,2])=b;
    toc

使用
tic
toc
使运行速度大大加快

,这不是测试运行时间的合适方法。查看
timeit
函数或示例。如果差异仍然存在,我们可以在这里讨论这个问题。对于像减号这样的“琐碎”操作,索引的成本将变得相当大。您可以包括索引操作,如
c=a(:,1:2)编码到基准中以供参考。我想与完整的代码相比,运行时是很重要的。在最近的MATLAB版本中,您也可以尝试广播(
a=a-[1,1,0];
a(:,1:2)=a(:,1:2)-[1,1];
)可能更快,我不知道。正如@Daniel所建议的,成本在索引中。将
a
中的数据复制到新矩阵中,应用该运算,然后将结果复制回。不,不要将循环放入函数中
timeit
计算调用函数以获得良好时间估计的频率。在第二种方法中,没有索引,因此没有复制。它使用整个矩阵。当你使用矩阵的子集时,MATLAB需要复制。这有点欺骗lol。在我的情况下,需要复制,但在其他情况下,这可以被认为是解决方案。