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;