2012-01-18 64 views
2

我需要能夠返回維度爲LxLxL..xL的矩陣的元素的索引[x1 x2 ... xd]。維數d是提供給我的函數的變量。該矩陣不存在,而是我有一個長度爲L^d的線性數組。對於數組中的給定索引i,我想知道矩陣中的等效索引。我已經可以使用簡單的for循環來做到這一點,但我很想知道我是否可以以某種方式使用ind2sub。我的問題是,如果我做返回可變維矩陣的下標

x=zeros(1,d) 
x=ind2sub(L,i) 

x被重新分配一個單一的數字,而不是所有下標的數組。有沒有辦法做到這一點?

回答

6

我假設「指數[x1 x2 ... xd]」是指沿等效d維陣列的每個維度的下標。

您需要將L和d轉換爲維數組,然後從ind2sub捕獲多個argout。這是一個這樣做的功能。你可以稱它爲x = myind2sub(L, d, i)

function out = myind2sub(L, d, ix) 

sz = repmat(L, [1 d]); %// dimension array for a d-dimension array L long on each side 
c = cell([1 d]); %// dynamically sized varargout 
[c{:}] = ind2sub(sz, ix); 
out = [c{:}]; 

但你也應該問爲什麼你的線性陣列中存儲並計算標,而不是僅僅將其存儲在首位多維數組。在Matlab中,多維數組存儲在連續的內存塊中,所以它很高效,可以使用多維下標或線性索引來索引它。如果您有線性陣列,只需撥打reshape(myarray, sz)將其轉換爲多維等值。

+0

謝謝!這是涉及多維度變化的模擬的一部分。 – Ivan 2012-01-18 22:53:03

+0

然後你可以使用'reshape()';它很便宜,因爲它只是在mxarray頭文件中包含維度元數據;底層數據將保留在內存中。實際上,Matlab的數組支持已經做到了這一點,並在用戶代碼中重新實現它可能會讓你的代碼變慢。 – 2012-01-18 22:58:16

+0

這麼聰明。謝謝謝謝。 – Frederick 2013-11-06 17:14:20