2011-12-19 10 views
4

2つの配列M1とM2があるとします。どちらも次元m x n x pを持ちます。私は、M1は、第三の次元に沿った最大要素に対応するm×n個のアレイに興味があるので、私は何:混合インデックス形式のMATLABで多次元配列にアクセスする方法

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

M1max両指数は、M×N個のアレイです。しかし今、私はM1の最大要素に対応するM2の要素にアクセスしたいとします(つまり、M1maxで終わったM1の要素と同じインデックスを持つM2の要素すべてが必要です)。これはどうすればいいですか?

答えて

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

+0

もちろんです。指数は第3の暗闇に沿っている。 @Oliで説明されているように、 'sub2ind'も必要です。 – Nzbuu

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

+0

私は同意します。これは難しいですが、他の言語よりもmatlab/ocatveの方がはるかに簡単です。 – Oli

1

もう一つの方法は、maxからインデックスを無視している:

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

ダブルスを比較して高精度に問題がある可能性があります。複数の同一の最大値は、第3次元でM1に存在する場合は、さらに

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

を行うことができ、この場合には、このコードに問題があるでしょう。

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