2013-10-24 30 views
2

我有以下代碼,其中包括3迭代for循環以創建一個上對角矩陣,我計劃多次執行大型數據集,並希望使盡可能計算效率。多個嵌入for循環的矢量化

data = magic(3); 
n = size(data,1); 
W = zeros(n,n); 
for i = 1:n 
    for j = i:n 
     if i==j 
      W(i,j)=0; 
     else 
      for k = 1:n 
       temp(1,k) = (data(i,k)-data(j,k))^2; 
       sumTemp = sumTemp + temp(1,k); 
      end 
      W(i,j)=sqrt(sumTemp); 
     end 
     temp = 0; 
     sumTemp = 0;   
    end 
end 

答案應該是這樣的:

[0 6.4807 9.7980 
0 0 6.4807 
0 0 0] 

我的工作很難的權利,但數字我會扔在那裏的情況下,任何人有會救我擺弄周圍小時的任何建議。

+0

什麼是'm'?你最好解釋什麼是內部操作,建議解決方案會更容易。 – Oleg

+0

良好的皮卡,這是錯字 - 也應該是 - 我將它固定在原始文章中。 –

+0

什麼是www?從未使用,從未初始化。 – Daniel

回答

1

這頂帽子我都不得不時刻:

data = magic(3); 
n = size(data,1); 
W = zeros(n,n); 
for i = 1:n 
    for j = i+1:n 
    W(i,j)= norm(data(i,:)-data(j,:)) 
    %W(i,j)= sqrt(sum((data(i,:)-data(j,:)).^2));  
    end 
end 

我做了什麼:

  • vecorized內環
  • 去除WWW,這是未使用
  • 改變第二環,從i + 1開始,因爲沒有完成i = j
  • 用規範(ab)替換sqrt((ab)。^ 2)

現在的 「全面」 量化:

data = magic(3); 
n = size(data,1); 
W = zeros(n,n); 
tri=triu(ones(n,n),1)>0; 
[i,j]=find(tri); 
W(tri)=arrayfun(@(i,j)norm(data(i,:)-data(j,:)),i,j) 
+2

sqrt-sum-of-squares看起來非常像2-範數。 –

+0

@BenVoigt:回覆更新,thx。 – Daniel

1

這裏是bsxfun一個簡單的解決方案:

Wfull = sqrt(squeeze(sum(bsxfun(@minus,data,permute(data,[3 2 1])).^2,2))) 
W = triu(Wfull) 

使用這其中dataN-by-D,其中N是點的數量和D是尺寸。例如,

>> data = magic(3); 
>> triu(sqrt(squeeze(sum(bsxfun(@minus,data,permute(data,[3 2 1])).^2,2)))) 
ans = 
     0 6.4807 9.7980 
     0   0 6.4807 
     0   0   0 
>> data = magic(5); data(:,end-1:end)=[] 
data = 
    17 24  1 
    23  5  7 
    4  6 13 
    10 12 19 
    11 18 25 
>> triu(sqrt(squeeze(sum(bsxfun(@minus,data,permute(data,[3 2 1])).^2,2)))) 
ans = 
     0 20.8087 25.2389 22.7376 25.4558 
     0   0 19.9499 19.0263 25.2389 
     0   0   0 10.3923 18.3576 
     0   0   0   0 8.5440 
     0   0   0   0   0 
>> 
+0

感謝 - 偉大的東西,我是新的矢量化,但愛它。 –

+1

@ user2913719 - 太棒了!它可以很有趣。注意['arrayfun'通常比循環慢](http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why)而不是真正的向量化IMO。嘗試使用'bsxfun'或僅使用線性代數進行矢量化。 – chappjc

+0

我想一條線太簡單了。我想,這就是它有時會如此。 – chappjc