假設我有兩個數組M1和M2。兩者都有尺寸m x n x p。我感興趣對應於沿第三維的最大元素M1的M×N陣列中,所以我:如何使用混合索引格式訪問MATLAB中的多維數組
[M1max, indices]=max(M1,[],3);
兩個M1max和指數是m×n個陣列。但是現在假設我想訪問M2中對應於M1中最大元素的元素(也就是說,我希望M2中所有元素具有相同索引作爲M1中以M1max結尾的元素)。我該怎麼做呢?
假設我有兩個數組M1和M2。兩者都有尺寸m x n x p。我感興趣對應於沿第三維的最大元素M1的M×N陣列中,所以我:如何使用混合索引格式訪問MATLAB中的多維數組
[M1max, indices]=max(M1,[],3);
兩個M1max和指數是m×n個陣列。但是現在假設我想訪問M2中對應於M1中最大元素的元素(也就是說,我希望M2中所有元素具有相同索引作爲M1中以M1max結尾的元素)。我該怎麼做呢?
這可能是比@奧利的建議稍快,但他們基本上相當於:
[M1max, indices] = max(M1,[],3);
[m n p] = size(M1);
idx = (1:m*n).' + (indices(:)-1)*m*n;
M2max = reshape(M2(idx), m, n);
我認爲這應該使它:
[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)
並重塑它。
另一種方式是從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')
是的,那是行不通的 – Patrick 2011-12-20 00:30:27
當然。 「指數」就在第三個暗點。您還需要'sub2ind',如@Oli所述。 – Nzbuu 2011-12-20 09:41:41