Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在MATLAB中使用矢量化代替多个for循环来减少计算时间_Matlab_For Loop_Vector - Fatal编程技术网

通过在MATLAB中使用矢量化代替多个for循环来减少计算时间

通过在MATLAB中使用矢量化代替多个for循环来减少计算时间,matlab,for-loop,vector,Matlab,For Loop,Vector,我有一个很长的MATLAB代码,这需要很多时间,因为有许多for循环。我试图消除它们,但看起来我不理解矢量化的概念。更具体地,考虑以下两个不同大小的向量的简单示例: a1=[1 2]; a2=[1 2 3]; 我想以“分段”的方式计算a1/a2。为此,我将以下用于循环 div=0; for i=1:size(a1,2) for j=1:size(a2,2) div=div+a1(i)/a2(j); end end 如何将这两个for循环矢量化?非常感谢 这对你有用 a1=[1 2];

我有一个很长的MATLAB代码,这需要很多时间,因为有许多
for
循环。我试图消除它们,但看起来我不理解矢量化的概念。更具体地,考虑以下两个不同大小的向量的简单示例:

a1=[1 2];
a2=[1 2 3];
我想以“分段”的方式计算
a1/a2
。为此,我将以下
用于
循环

div=0;
for i=1:size(a1,2)
 for j=1:size(a2,2)
  div=div+a1(i)/a2(j);
 end
end

如何将这两个for循环矢量化?非常感谢

这对你有用

a1=[1 2];
a2=[1 2 3];
div_matrix = a1' ./ repmat(a2, [size(a1,2), 1])
sum(div_matrix(:))

两个不错的选择:
bsxfun
ndgrid
。给定两行向量:

a1=[1 2];
a2=[1 2 3];
bsxfun

传统的方法是两次
repmat
调用。虚拟复制现在可以通过以下方式完成:

repmat
更快、内存效率更高

ndgrid

当你想到“所有的组合”时,想想


只需矩阵乘法即可:一个列向量乘以一个行向量得到一个包含所有元素乘积组合的矩阵:

divs = a1(:) * (1./a2(:)).';
div = sum(divs(:));

@路易斯曼多,你说得对!啊,诅咒你!为什么我不想把
a2
倒过来呢?
[ii,jj] = ndgrid(1:numel(a2),1:numel(a1))
divM = a1(jj)./a2(ii);
div = sum(divM(:))
divs = a1(:) * (1./a2(:)).';
div = sum(divs(:));