2011-05-05 44 views
14

我正在寫一個MATLAB函數來讀出數據到一個n維數組(可變維度大小)。我需要能夠訪問矩陣中的特定點(例如,寫入或讀取它),但我不知道需要指定多少個索引。使用向量作爲矩陣的索引

目前我有一個current_point矢量,我遍歷指定每個索引,並指定數組的大小的max_points矢量。所以,如果例如,我想大小1000逐15×3,max_points = [1000 15 3]的3維陣列,並且從[1, 1, 1]current_point迭代到[1000, 15, 3][1, 1, 1] - >[1000, 1, 1] - >[1, 2, 1] - >[1000, 2, 1] - > ...) 。我希望能夠做的是飼料current_point作爲索引矩陣,像這樣:

output_matrix(current_point) = val 

但很顯然,像output_matrix([1 2 3]) = val將只設置outputmatrix(1:3) = 30。我不能只是使用虛擬變量,因爲有時矩陣需要3個索引,其他時間4,其他時間2等,所以一個可變長度的向量真的是我需要的。有一種簡單的方法可以將矢量用作索引中的點嗎?

+0

這是*本質* [緊湊MATLAB矩陣索引符號(的副本http://stackoverflow.com/questions這隻適用/ 792683/compact-matlab-matrix-indexing-notation),儘管也許這個問題比這種情況要簡單一些。 – gnovice 2011-05-05 21:59:41

+0

我知道這一定是以前被問過的,但是無法用我的dupe插件找到它。我想我會讓答案保持不變,因爲問題標題比另一個更直接,可能更容易搜索。 – abcd 2011-05-05 22:11:30

+0

我認爲它在某些時候一定被問過了,但從標題中我什麼都看不到。來自你們兩個的好答案。我認爲會有這樣簡單的事情。 – Paul 2011-05-05 23:37:12

回答

17

使用函數sub2ind創建linear index是此問題的典型解決方案,如此closely-related question中所示。您也可以撥打compute a linear index yourself而不是撥打sub2ind

但是,您的情況可能比我鏈接到的其他問題更簡單。如果您只使用您的current_point向量(即,向您指定單個點)。它只是n維矩陣中的一個n元素下標向量),那麼您可以使用一個簡單的解決方案,使用函數num2cellcurrent_point轉換爲下標單元陣列,並使用它來創建索引的comma-separated list。例如:

current_point = [1 2 3 ...];  % A 1-by-n array of subscripts 
subCell = num2cell(current_point); % A 1-by-n cell array of subscripts 
output_matrix(subCell{:}) = val; % Update the matrix point 

操作subCell{:}創建打字subCell{1}, subCell{2}, ...,其是鍵入current_point(1), current_point(2), ...的等效的等效。

3

您可以使用sub2ind函數從下標中獲取線性索引。

實施例:

A=magic(4) 

A = 

    16  2  3 13 
    5 11 10  8 
    9  7  6 12 
    4 14 15  1 

selectElement={2,3}; %# get the element at position 2,3 in A. 
indx=sub2ind(size(A),selectElement{:}); 
A(indx) 

ans = 

    10 

在上面的例子中,我所存儲的下標(可以是任何數量的維度),爲cell。如果您將它存儲爲矢量,只需使用num2cell()將其轉換爲單元格即可。

您現在可以輕鬆地將此值指定爲A(indx)=value;。我使用了不同於你的變量來保持答案的一般性,但這個想法是一樣的,你只需要替換變量名。

你也在你的帖子中提到你正在從(1,1,1)循環到某個值,(1000,15,3)併爲這些點中的每一個賦值。如果您沿着列循環,則可以用矢量化解決方案替換整個操作。

finalElement={1000,15,3}成爲循環的最後一步。和以前一樣,找到線性指數

index=sub2ind(size(A),finalElement{:}); 

現在,如果你有你在存儲爲單個矢量,values循環分配值,你可以簡單地給它分配在一個單一的步驟爲

A(1:index)=values; 
10

我知道這太晚了,但任何人都會發現這個話題。對我來說最簡單的方法是使用:diag(A (x(:),y(:)));

不幸的是,如果你需要從矩陣得到的值,不改變值

+2

你可以進一步解釋這一點,我不明白它,但它看起來可能是一個不錯的和簡單的解決方案 – Leo 2014-02-24 10:42:49

+0

真棒...作品完美! +1 – bluebox 2015-11-06 20:08:14