2017-10-04 216 views
0

有没有什么办法可以避免在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循环在另一个循环中重复,避免使用它的目的是使代码更快。

+0

'count'需要做什么?你可以为'M'和'B'添加一个小样本,以便我们可以运行它吗? – 10a

+0

是的,我做到了。 @ 10a –

+0

'countm'和'count'在您将其分配到循环中之前都不存在,因此此代码将出错。另外:***不要***增长数组,而是简单地预先分配它们,所有的麻烦可能会消失,因为这最像是让代码变慢。循环不再像过去那样糟糕,TMW的最新发展使它们与R2016b以来的矢量化几乎相当。 – Adriaan

回答

0
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

试一试,只有这样你才能知道最适合你的具体情况。我认为矢量化方法应该更快。 –