2015-10-20 466 views
2

對不起,提出這樣一個簡單而愚蠢的問題,但Matlab對我來說實在太難了。我的問題是如何在Matlab中找到三維數組的最小值的位置。在Matlab中找到三維數組的最小值的位置

例如,假設我定義了一個三維陣列

m=zeros(2,2,2); 
m(1,2,2)=-2; 

m的最小值應爲-2,位於(1,2,2)。我可以

m0=min(min(min(m))); 

找到最小值但是當我用

[x y z]=find(m==m0); 

而不是返回x=1y=2z=2找到它的位置,它返回x=1y=4z=1

我很感謝有人會回答這個問題!

回答

3

您可以使用min找到m最小的指數,然後將其轉換爲xyz座標。有沒有也需要使用find也。

min可與多個輸出參數一起使用以返回最小元素的索引。在這裏,我還使用:m的每個元素都作爲列向量返回。

>> m=zeros(2,2,2); 
>> m(1,2,2)=-2; 
>> m(:) 
ans = 
    0 
    0 
    0 
    0 
    0 
    0 
    -2 
    0 
>> [~, ind] = min(m(:)) 
ind = 
    7 

現在,我們有我們的索引,我們需要將其轉換回xyz座標。這可以使用ind2sub或手動手動完成。

>> [x y z] = ind2sub(size(m), ind) 
x = 
    1 
y = 
    2 
z = 
    2 
+0

+1我知道'min'的'[val,ind]'版本,但我沒有想到將它與列向量'm(:)'結合使用。這是做到這一點的方法。 –

2

你是對的。這比它應該更復雜。問題是MATLAB被硬連線處理矩陣(即等級2的數組),而不是一般等級的數組。這裏的解決方案:

m0 = min(m(:)) 
[x y z] = ind2sub(size(m), find(m(:) == m0)) 

說明:

如果鍵入help find,你可能會注意到你的原代碼使用的find[rows, cols, vals]版本,這是不是你所期望的。

相反,min(m(:))是您的min(min(min(m)))的簡化。它會自動將m重塑爲一個排列(即矢量)。

表達式find(m(:) == m0)爲此整形向量中的最小位置返回單個索引。最後,ind2sub將此單一索引轉換爲一組三個索引,給定m的形狀。

相關問題