2013-07-09 128 views
0

我想從下面的代碼中去除for循環並對其進行向量化,但它是2維操作。你能幫我麼。如何在Matlab中以二維矩陣向量化操作

for i=1:10 
    savingsFull(i,:) = distances(i,9)+distances(9,knnIdx(i,:))-distances(i,knnIdx(i,:)); 
end 

在這裏, 「距離」 是10×10對稱矩陣和 「knnIdx」 是如下一個10X2矩陣:

1 10 
2 10 
3  8 
4  8 
5  4 
6  5 
7  2 
8  4 
9  8 
10  1 

「savingsFull」 也是10X2矩陣。

+0

使用'bsxfun'向量化 – Shai

+0

我處理所有矩陣作爲矢量並在其上應用公式。 – remo

回答

1

下面的代碼應該有所幫助:

savingsFull = distances(:, [9 9]) + [distances(9, knnIdx(:, 1)).', distances(9, knnIdx(:, 2)).'] - [diag(distances(:, knnIdx(:, 1))), diag(distances(:, knnIdx(:, 2)))] 

如果knnIdx的第一列是隨之而來的數字1到10,那麼你就可以簡化爲

savingsFull = distances(:, [9 9]) + [distances(9, knnIdx(:, 1)).', distances(9, knnIdx(:, 2)).'] - [diag(distances), diag(distances(:, knnIdx(:, 2)))] 
+0

你能否描述一下點運算符在距離中的作用(9,knnIdx(:,1))。 謝謝 – remo

+1

@remo,'''和'.''運算符的區別在於'。''轉置了一個矩陣,'''只改變了維度。所以他們之間有一個簡單的關係:'A'= conj(A'');'。所以'距離(9,knnIdx(:, 1))。「'導致列向量而不是行向量。所以,假設「距離」是實數值,那麼'''和'.''應該沒有區別。 – akademi4eg

+0

好像我在之前的評論中已經交換了定義。對不起=)無論如何,你可以檢查他們兩個的MATLAB參考。 [ctranspose](http://www.mathworks.com/help/matlab/ref/ctranspose.html),[轉置](http://www.mathworks.com/help/matlab/ref/transpose.html) – akademi4eg