2010-03-12 3 views
7

2 차원 배열을 가지고 있는데이 배열을 'A'라고합니다. 두 개의 다른 2D 배열이 있는데, 'ix'와 'iy'라고 부릅니다. X_idx 및 y_idx에서 제공하는 인덱스 쌍에서 A의 요소 인 요소의 출력 배열을 만들고 싶습니다. 다음과 같이 루프를 사용하여이 작업을 수행 할 수 있습니다.두 배열을 배열 인덱스로, matlab/octave 단위로 정의합니다.


for i=1:nx 
    for j=1:ny 
     output(i,j) = A(ix(i,j),iy(i,j)); 
    end 
end 

어떻게 루프없이이 작업을 수행 할 수 있습니까? 제가 output = A (ix, iy)를하면, (ix) X (iy)의 전체 범위에 걸쳐 A의 값을 얻습니다.

이것은 sub2ind를 사용하는 명확하고 더 효율적인 방법이 될 것이다 큰 행렬

reshape(diag(A(ix(:),iy(:))),[ny nx]) 

매우 효율적이지 한 줄 방법입니다, 제이슨

+0

이주의 1 차원 배열 (열 방향으로 순서)로 행렬 A의 생각 - ix 배열을 사용하여 y 좌표를 제공하고 iy 배열을 사용하여 x를 제공합니다. MATLAB에서 첫 번째 인덱스는 y 좌표입니다. yout 출력 행렬에 대해서도 마찬가지입니다. for 루프에 대해 잘못된 제한을 사용하고 있습니다. –

+0

좋은 지적이지만 데이터를 사용하는 방법에 따라 약간 다릅니다. 그가 자신의 매트릭스를 표시하는 것이 Matlab 규약과 다른 근본적인 문제가 아니라 x 위와 아래를 보여줄 것이라는 점에 신경 쓰지 않는다면. 그러나 확실히 알고있는 것이 중요합니다, 나는 동의합니다. –

답변

11

더 빠른 방법은 직접 SUB2IND를 호출하지 않고 선형 색인을 사용하는 것입니다

output = A(size(A,1)*(iy-1) + ix) 
...

+0

와우, 훨씬 빠릅니다! 고맙습니다. – Jason

+2

@ Jacob : 사실,'output'은'ix'와 같은 크기로 끝날 것입니다. – gnovice

+0

지능적인 답변! 정말 고마워요. –

2

을 주셔서 감사합니다. - 일반적으로 jx 또한

newA = A(sub2ind(size(A),ix,iy)); 

표기 xyij을 혼동하지 마십시오 : ixiy 같은 수의 요소가있을 때 나는 (당신처럼) 상황에 대한 수다의 의견을 통합 한 열을 나타내며 iy은 행을 나타냅니다.

+0

남자, 모든 편집을 미안 해요! 나는 오늘 명확하게 생각하고 있지 않다. – Jacob

+2

sub2ind 코드는 다음과 같이 사용할 수 있습니다. newA = A (sub2ind (size (A), ix, iy)); – yuk

+0

완벽! 고마워요! – Jason