【问题标题】:Summing elements of one Matrix according to the the values in another matrix into an array根据另一个矩阵中的值将一个矩阵的元素求和到一个数组中
【发布时间】:2013-09-20 14:42:06
【问题描述】:

我想根据矩阵R中的值将矩阵M的元素相加到数组d中。

理论上,它不能被序列化,因为求和到一个数组(D)的动作需要内存访问相同的数据。

我是这样实现的

for ind = 1: numel(R)
    d(R(ind)) = d(R(ind)) + M(ind);      
end 

就像@Andrew 在这个相关主题中建议的那样: How do I iterate through each element in an n-dimensional matrix in MATLAB?

数组R的元素并不是每一个都很大,也不是1或2,例如可以是1到15。

在 Matlab 中是否有更有效的方法来做到这一点,即使动作的“理论复杂性”会更糟?

因为它也可以通过迭代 R 中的可能值并在 R = val 的索引中求和 M 的元素或 Matlab 中更多“内置”的元素来解决,这些元素通常不“喜欢”循环说话。

例如,在 SQL 中,您有一个“内置”方法来折叠一列的重复并获取另一列中值的总和。

有一个关于类似动作但语言不同的主题: Collapse a matrix to sum values in one column by values in another

【问题讨论】:

  • 请给出 R 和 M 的一些最小示例以及预期的输出。

标签: arrays matlab loops matrix sum


【解决方案1】:

这很可能可以使用 Matlab 的accumarray 函数来完成。像这样的:

d = accumarray(R, M, expected_size_of_d)

但是,如果您给我们提供 MR 的示例值以及预期的 d,这将很有用,因为确切的解决方案可能取决于您的矩阵的形状,如果您使用线性索引或不是……

【讨论】:

    【解决方案2】:

    你的问题不是很清楚。如果您想对M 的选定元素求和,其中选择由R 给出,您可以执行以下操作:

    dsum(M(sub2ind(size(M),R(:,1),R(:,2))))
    

    例如,考虑

    M = [1 2 3;
         4 5 6;
         7 8 9];
    
    R = [1 1; 3 1; 2 2]; % each row selects an element of M
    

    结果给出 M(1,1) + M(3,1) + M(2,2):

    >> sum(M(sub2ind(size(M),R(:,1),R(:,2))))
    ans =
        13
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多