Optimization 基于一维索引列表的多维数组高效赋值
我有一个矩阵Optimization 基于一维索引列表的多维数组高效赋值,optimization,multidimensional-array,octave,Optimization,Multidimensional Array,Octave,我有一个矩阵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 有没有更有效的方法 二维案例的可视化: M = 1 4 7 10 2 5 8
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
有没有更有效的方法
二维案例的可视化:
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
您可以使用
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;
您不需要
重塑
和M=M(:)
,它就可以在Matlab中工作。我发现这是可行的:
K = K(:)'+(S1*(0:numel(K)-1));
M(K) = V;
也许这应该和Gelliant的答案是一样的,但我无法让他的答案起作用,不知何故,=/而不是
K=sub2ind(s,K,[1:s(1)],
它必须是K=sub2ind(s,K,[1:s(2)],
,嗯,它说所有的下标都必须是相同大小的(我用的是倍频程)。@只有一半在倍频程4.2.0中有效,也许您使用的是非常旧的版本?
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;
K = K(:)'+(S1*(0:numel(K)-1));
M(K) = V;