2017-10-10 1 views
0

의 행렬 M이 있습니다.인덱스 목록을 기반으로 한 다차원 배열에 효율적으로 값을 할당하는 방법

다른 매트릭스 K은 할당하고자하는 첫 번째 차원의 인덱스로 사용되며 크기는 [1, S2, S3]입니다.

V은 대응하게 할당 될 값을 포함하는 [1, S2, S3] 행렬이다. for 루프와

, 이것은 내가 그것을 어떻게 있습니다 :

for x2 = 1:S2 
    for x3 = 1:S3 
    M(K(1,x2,x3), x2, x3) = V(1, x2, x3) 
    endfor % x3 
endfor % x2 

이 할 수있는 더 효율적인 방법이 있나요? 2D 케이스

시각화 :

 
M = 
    1 4 7 10 
    2 5 8 11 
    3 6 9 12 

K = 
    2 1 3 2 

V = 
    50 80 70 60 

Desired = 
    1 80 7 10 
50 5 8 60 
    3 6 70 12 

테스트 케이스 :

 
M = reshape(1:24, [3,4,2]) 
K = reshape([2,1,3,2,3,3,1,2], [1,4,2]) 
V = reshape(10:10:80, [1,4,2]) 
s = size(M) 
M = assign_values(M, K, V) 
M = 

ans(:,:,1) = 

    1 20 7 10 
    10 5 8 40 
    3 6 30 12 

ans(:,:,2) = 

    13 16 70 22 
    14 17 20 80 
    50 60 21 24 

는 내가 거기 assign_values을 구현하기위한 효율적인 방법을 찾고 있어요.

 
key = sub2ind(s, K, [1:s(2)]) 
error: sub2ind: all subscripts must be of the same size 

답변

1

당신은 선형 인덱스로 개별 첨자를 사용하는 sub2ind를 사용할 수 있습니다 어떻게 든 Gelliant의 답변을 실행

날이에게 제공합니다. 그런 다음이 값을 사용하여 V의 값으로 바꿀 수 있습니다. 이 matlab에에서 일하기 위해

M = [1 4 7 10 ;... 
    2 5 8 11 ;... 
    3 6 9 12]; 
s=size(M); 
K = [2 1 3 2]; 
K = sub2ind(s,K,[1:s(2)]) 
V = [50 80 70 60]; 
M(K)=V; 

당신은 reshapeM=M(:) 필요하지 않습니다.

+0

을 그의 대답 작업을 대신 할 수 없습니다 = sub2ind (s, K, [1 : s (1)])'K = sub2ind (s, K, [1 : s (2)])', – Irreducible

+0

감사합니다. – Gelliant

+0

흠,'모든 첨자는 같은 크기 여야합니다 .' (Octave를 사용하고 있습니다). – justhalf

0

나는이 작품 발견 : 아마도 이것은 Gelliant의 대답과 같은 방식으로 작동하도록되어

K = K(:)'+(S1*(0:numel(K)-1)); 
M(K) = V; 

,하지만 난 K ', 어떻게 든 =/

관련 문제