2011-12-19 26 views
4

假設我有兩個數組M1和M2。兩者都有尺寸m x n x p。我感興趣對應於沿第三維的最大元素M1的M×N陣列中,所以我:如何使用混合索引格式訪問MATLAB中的多維數組

 [M1max, indices]=max(M1,[],3); 

兩個M1max和指數是m×n個陣列。但是現在假設我想訪問M2中對應於M1中最大元素的元素(也就是說,我希望M2中所有元素具有相同索引作爲M1中以M1max結尾的元素)。我該怎麼做呢?

回答

0

這可能是比@奧利的建議稍快,但他們基本上相當於:

[M1max, indices] = max(M1,[],3); 
[m n p] = size(M1); 
idx = (1:m*n).' + (indices(:)-1)*m*n; 
M2max = reshape(M2(idx), m, n); 
+0

是的,那是行不通的 – Patrick 2011-12-20 00:30:27

+0

當然。 「指數」就在第三個暗點。您還需要'sub2ind',如@Oli所述。 – Nzbuu 2011-12-20 09:41:41

2

我認爲這應該使它:

[y x]=ndgrid(1:size(M1,1),1:size(M1,2)); 
reshape(M2(sub2ind(size(M1),y(:),x(:),indices(:))),[size(M1,1),size(M1,2)]); 
你希望所有與 idx <-> (y,x,indices(y,x))指數

,這將計算它。然後計算M2(idx)並重塑它。

+0

這是這樣的東西,讓我討厭matlab。像這樣的東西應該不難。但它是。 :( – John 2011-12-20 15:36:45

+0

我同意這個很難,但是matlab/ocatve中的大多數東西比其他語言要容易得多。 – Oli 2011-12-20 15:51:14

1

另一種方式是從max忽略指數:

indices2 = M1 == repmat(M1max,[1,1,size(M1,3)]); 
result = reshape(M2(indices2),size(M1max)); 

有可能是一個精密的問題與比較雙打。在這種情況下,你可以做

indices2 = repmat(M1max,[1,1,size(M1,3)]) - M1 < eps; 

另外,如果在第三維中存在M1多個相同的最大值會有這段代碼的問題。我們可以通過

assert(sum(indices2(:))==numel(M1max),'Multiple maximum values found')