我有一个大小为M
的矩阵[S1, S2, S3]
。
我有另一个矩阵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
。
以某种方式运行Gelliant的答案给了我这个:
key = sub2ind(s, K, [1:s(2)]) error: sub2ind: all subscripts must be of the same size
答案 0 :(得分: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;
您无需reshape
和M=M(:)
即可在Matlab中使用。
答案 1 :(得分:0)
我发现这有效:
K = K(:)'+(S1*(0:numel(K)-1));
M(K) = V;
也许这应该和Gelliant的回答一样,但我不能让他的回答有效,不知何故= /