基于一维上的索引列表,有效地将值分配给多维数组

时间:2017-10-10 12:49:07

标签: 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

有更有效的方法吗?

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

2 个答案:

答案 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;

您无需reshapeM=M(:)即可在Matlab中使用。

答案 1 :(得分:0)

我发现这有效:

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

也许这应该和Gelliant的回答一样,但我不能让他的回答有效,不知何故= /