通过在MATLAB中使用矢量化代替多个for循环来减少计算时间
我有一个很长的MATLAB代码,这需要很多时间,因为有许多通过在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];
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(:));