2012-01-18 3 views
2

차원 LxLxL..xL의 행렬 요소의 인덱스 [x1 x2 ... xd]를 반환 할 수 있어야합니다. 차원 수 d는 내 함수에 제공되는 변수입니다. 행렬이 존재하지 않고, 대신 길이가 L^d 인 선형 배열이 있습니다. 배열의 주어진 인덱스 i에 대해 행렬의 해당 인덱스를 알고 싶습니다. 이미 for 루프를 사용하여이 작업을 수행 할 수 있지만 ind2sub를 어떻게 든 사용할 수 있는지 궁금합니다. 내가 가진 문제는 내가하는 것입니다.가변 차원 행렬의 첨자를 반환

x=zeros(1,d) 
x=ind2sub(L,i) 

x는 하나의 숫자이며 모든 첨자의 배열로 재 할당됩니다. 이 일을하는 방법이 있습니까?

답변

6

"인덱스 [x1 x2 ... xd]"로 가정하면 해당하는 d 차원 배열의 각 차원에 대한 첨자를 의미합니다.

L과 d를 차원 배열로 변환 한 다음 ind2sub에서 여러 개의 인수를 캡처해야합니다. 이렇게하는 함수가 있습니다. x = myind2sub(L, d, i)과 같이 부를 수 있습니다.

function out = myind2sub(L, d, ix) 

sz = repmat(L, [1 d]); %// dimension array for a d-dimension array L long on each side 
c = cell([1 d]); %// dynamically sized varargout 
[c{:}] = ind2sub(sz, ix); 
out = [c{:}]; 

하지만 대신 처음부터 다차원 배열에 저장의 선형 배열에 저장하고 첨자를 계산하는 이유 당신은 또한 요청해야합니다. Matlab에서 다차원 배열은 인접한 메모리 블록에 저장되므로 효율적이며 다차원 첨자 또는 선형 인덱싱을 사용하여 효율적으로 인덱스 할 수 있습니다. 선형 배열을 사용하는 경우 reshape(myarray, sz)을 호출하여 다차원 배열로 변환하면됩니다.

+0

고마워요! 이것은 여러 차원의 변화를 포함하는 시뮬레이션의 일부입니다. – Ivan

+0

당신은'reshape()'를 사용할 것입니다; 그것은 mxarray 헤더의 차원 메타 데이터를 왜곡시키기 때문에 값이 싸다. 기본 데이터는 그대로 메모리에 남아 있습니다. 사실, Matlab의 배열 지원은 이미이 작업을 수행하고 사용자 코드에서이를 다시 구현하면 코드가 느려질 수 있습니다. –

+0

너무 영리합니다. 고마워요. – Frederick