2009-04-27 53 views
8

我有一個n×k大小的矩陣,每行包含k個數字。我想用這些k個數字作爲索引到一個k維矩陣中。在MATLAB中有沒有緊湊的方法,或者我必須使用for循環嗎?緊湊的MATLAB矩陣索引表示法

這就是我想做的事(在MATLAB僞代碼),但在一個更加MATLAB上下的方式:

for row=1:1:n 
    finalTable(row) = kDimensionalMatrix(indexmatrix(row, 1),... 
      indexmatrix(row, 2),...,indexmatrix(row, k)) 
end 

回答

15

如果你想避免使用一個for循環,這可能是做最徹底的方法:

indexCell = num2cell(indexmatrix,1); 
linearIndexMatrix = sub2ind(size(kDimensionalMatrix),indexCell{:}); 
finalTable = kDimensionalMatrix(linearIndexMatrix); 

說明:

第一行把indexmatrix的每一列使用NUM2CELL分成單元陣列的單獨單元。這使我們能夠通過所有ķ列作爲一個comma-separated listSUB2IND,即下標指數(行,列等)轉換成線性指數(每個矩陣元素編號從1到N,N是一個功能矩陣中元素的總數)。最後一行使用這些線性索引來替換for循環。關於矩陣索引(下標,線性和邏輯)的一個很好的討論可以在here找到。深思

吃點東西...

的傾向迴避了有利於量化解決方案的環路走,是許多MATLAB用戶(包括我自己)都已經習慣了。然而,更新版本的MATLAB可以更有效地處理循環。正如在另一個SO問題this answer中討論的那樣,使用for循環有時會導致運行速度更快的代碼,而不是使用矢量化解決方案。

我當然不是說你不應該嘗試向量化你的代碼,只是每個問題都是獨一無二的。向量化通常效率更高,但不是總是。對於您的問題,for循環與矢量化代碼的執行速度可能取決於值nk是多大。

6

要當作獨立的標矢量indexmatrix(row, :)的元素,你需要的元素作爲單元陣列。所以,你可以做這樣的事情

subsCell = num2cell(indexmatrix(row, :)); 
finalTable(row) = kDimensionalMatrix(subsCell{:}); 

要展開subsCell作爲一個逗號分隔的列表,不幸的是你需要的兩條獨立的線路。但是,此代碼獨立於k

+0

太棒了!你能獨立於行數嗎? – AnnaR 2009-04-27 11:52:46

0

將您的分項指數爲線性指數在哈克的方式

ksz = size(kDimensionalMatrix); 
cksz = cumprod([ 1 ksz(1:end-1)]); 
lidx = (indexmatrix - 1) * cksz' + 1; #' 
% lindx is now (n)x1 linear indices into kDimensionalMatrix, one index per row of indexmatrix 
% access all n values: 
selectedValues = kDimensionalMatrix(lindx); 

乾杯!