2017-10-10 170 views
0

我有一個大小爲[S1, S2, S3]的矩陣M基於一維索引列表有效地將值分配給多維數組

我有另一個矩陣K作爲我想分配的第一個維度的索引,大小爲[1, S2, S3]

And V是一個[1, S2, S3]矩陣,它包含要相應分配的值。

隨着循環,這是我做的:

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有一種有效的方式。

莫名其妙運行Gelliant的回答給了我這樣的:

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

回答

1

您可以使用sub2ind使用您的個人標線性指標。然後可以用這些值替換V中的值。

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(:)爲它在Matlab工作。

+0

而不是'K = sub2ind(s,K,[1:s(1)])'它一定是'K = sub2ind(s,K,[1:s(2)]', – Irreducible

+0

謝謝,我更新了我的答案。 – Gelliant

+0

嗯,它說'所有的下標必須是相同的大小'(我正在使用八度)。 – justhalf

0

我發現這工作:

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

或許這是應該的工作方式Gelliant的答案一樣,但我不能讓他的答覆工作,不知何故=/