【问题标题】:Efficiently assigning values to multidimensional array based on indices list on one dimension基于一维索引列表有效地将值分配给多维数组
【发布时间】:2017-10-10 12:49:06
【问题描述】:

我有一个矩阵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 案例的可视化:

米= 1 4 7 10 2 5 8 11 3 6 9 12 ķ = 2 1 3 2 V = 50 80 70 60 所需 = 1 80 7 10 50 5 8 60 3 6 70 12

测试用例:

M = 重塑(1:24, [3,4,2]) K = 重塑([2,1,3,2,3,3,1,2], [1,4,2]) V = 重塑(10:10:80,[1,4,2]) s = 尺寸(M) M = assign_values(M, K, V) 米= 答案(:,:,1)= 1 20 7 10 10 5 8 40 3 6 30 12 答案(:,:,2)= 13 16 70 22 14 17 20 80 50 60 21 24

我正在寻找一种有效的方法来在那里实现assign_values

运行 Gelliant 的答案以某种方式给了我这个:

键 = sub2ind(s, K, [1:s(2)]) 错误:sub2ind:所有下标的大小必须相同

【问题讨论】:

    标签: optimization multidimensional-array octave


    【解决方案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 中工作。

    【讨论】:

    • 必须是K = sub2ind(s,K,[1:s(1)]),而不是K = sub2ind(s,K,[1:s(2)])
    • 嗯,上面写着 all subscripts must be of the same size(我使用的是 Octave)。
    • @justhalf 这适用于 Octave 4.2.0,也许您使用的是非常旧的版本?
    【解决方案2】:

    我发现这行得通:

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

    也许这应该和 Gelliant 的回答一样起作用,但我无法让他的回答起作用,不知何故 =/

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2019-11-11
      • 2015-07-06
      • 1970-01-01
      • 2021-10-14
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多