2017-10-04 136 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

試一試,只有這樣你才能知道最適合你的具體情況。我認爲矢量化方法應該更快。 –