2017-02-02 2 views
1

두 개의 ND 배열 (10 * 4 * 4 * 2 * 4)이 있습니다. 여기서 첫 번째 열의 최대 값을 찾고 두 번째 열과 동일한 위치의 요소를 추출하려고합니다. 내가 가진 최대의 요소의 인덱스를 찾아 지금matlab에서 ND 배열의 특정 위치에서 여러 요소를 추출하는 방법은 무엇입니까?

A = randi(100,4,3,2); 
B = randi(10,size(A)); 

을 :

[~,ind] = max(A); 

그리고 내가 원하는

내가 다음과 같이 A와 B가의 가정하자 상황이 간단하게하려면 B에서 요소를 추출하려면 ind을 사용하십시오. 최적의 옵션은 C = B(ind)과 같지만 분명히 작동하지 않습니다. Matlab은 C의 크기가 ind (즉, 1 * 3 * 2)이되는 것을 제외하고는 C = B(ind(:))을 쓰는 것처럼 선형 인덱싱으로 ind을 참조합니다.

m = {ind,':',':'}; 
C = B(m{:}) 

을하지만이 indB 각 열의 선형 색인 인 크기 6 * 3 * 2의 배열 결과

그래서 (I는 here을 발견)의이 같은 시도 . 물론 루프를 사용해도되지만,보다 효율적이고 우아한 방법이 있다고 확신합니다.

예 :

A(:,:,1) = 
    40 89 30 
    73 77 30 
    59 61 14 
    29  2 30 
A(:,:,2) = 
    82 79  5 
    3 40 62 
    46 76 42 
    22 52 74 

B(:,:,1) = 
    5  1  9 
    3  3  5 
    8  4  4 
    8  3  9 
B(:,:,2) = 
    1  4  3 
    5  4  8 
    10  8  5 
    9  1  3 

ind(:,:,1) = 
    2  1  1 
ind(:,:,2) = 
    1  1  4 

그래서 결과가 있어야한다 :

C = 
    3  1 
    1  4 
    9  3 

나는 일반적인 솔루션을 찾아 주, 그리고이 예에만 치수에 맞는 하나. 당신이 선형 인덱스로 (하위) 인덱스로 변환하는 sub2ind을 사용할 수 있습니다 세 가지 차원를 들어

+0

이 예에서'C'의 원하는 크기 (모양) 무엇입니까? –

+0

'C'는'squeeze (ind)'처럼 보일 것입니다. – EBH

+0

그게 내 솔루션 않습니다. –

답변

1

: 치수의 임의의 수를 들어

[~, ind] = max(A,[],1); 
linind = sub2ind(size(A), reshape(ind, size(A,2), size(A,3)), ... 
    repmat((1:size(A,2)).', 1, size(A,3)), ... 
    repmat(1:size(A,3), size(A,2), 1)); 
C = B(linind); 

, 그것은 모든 차원을 축소하는 것이 더 쉽습니다 처음에는 1을 넘어서 max으로 전화하십시오. 이것은 또한 쉽게 빠른 수동 계산에 의해 sub2ind을 대체 할 수 있습니다 :

Ar = reshape(A, size(A,1), []); % collapse all dimensions beyond the first 
[~, ind] = max(Ar,[],1); % arg max of each column 
linind = ind + (0:size(Ar,2)-1)*size(Ar,1); % convert to linear indices 
C = B(linind); % index into C 
sz = size(A); % size of A 
C = reshape(C, sz(2:end)); % reshape C according to shape of A 
+0

답해 주셔서 감사합니다. 어떻게 이것을 원래의 문제 (10 * 4 * 4 * 2 * 4 크기)로 일반화 하시겠습니까? 각 차원에'repmats'를 추가해야합니까? – EBH

+0

@EBH 편집을 참조하십시오 –

+0

감사합니다 백만! 그것은 매력처럼 작동합니다;) 그리고 더 중요한 - 나는 이것을 이해할 수 있습니다 ... 나는 더 많은 투표권을 얻 자마자이를 +1 할 것입니다. (나는 오늘 그것들이 뛰었습니다) – EBH

관련 문제