避免在Matlab中循环
问题描述:
有没有什么办法可以避免在Matlab中使用下面的for循环? 'M'和'B'是100乘100对称矩阵,它的元素是已知的。避免在Matlab中循环
p1=rand(100,100).*25;
M=p1+p1';
p2=rand(100,100).*25;
B=p2+p2';
dr=0.2;
R=2 *dr;
for o=1:50
center= R*o;
MX= abs(M-center)<dr;
mm=MX.*B;
countB = [countm,sum(mm(:))/sum(mm(:)~=0)];
count = [count,sum(MX(:))];
end
*此for循环在另一个循环中重复,避免使用它的目的是使代码更快。
答
o = permute(1:50, [1,3,2]); % [ 1 x 1 x 50]
center = R*o; % [ 1 x 1 x 50]
MX = abs(M-center)<dr; % [100 x 100 x 50]
mm = MX.*B; % [100 x 100 x 50]
MX = reshape(MX, numel(M), numel(center)); % [100000 x 50]
mm = reshape(mm, numel(M), numel(center)); % [100000 x 50]
countB = sum(mm,1)./sum(mm==1); % [1 x 50]
count = sum(MX,1); % [1 x 50]
+0
是否比我的代码更快? –
+0
试一试,只有这样你才能知道最适合你的具体情况。我认为矢量化方法应该更快。 –
'count'需要做什么?你可以为'M'和'B'添加一个小样本,以便我们可以运行它吗? – 10a
是的,我做到了。 @ 10a –
'countm'和'count'在您将其分配到循环中之前都不存在,因此此代码将出错。另外:***不要***增长数组,而是简单地预先分配它们,所有的麻烦可能会消失,因为这最像是让代码变慢。循环不再像过去那样糟糕,TMW的最新发展使它们与R2016b以来的矢量化几乎相当。 – Adriaan