将一个Matrix的元素根据另一个矩阵中的值求和成一个数组

时间:2013-09-16 12:33:41

标签: arrays matlab loops matrix sum

我想根据矩阵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中的可能值并对索引中的M的元素求和来求解,其中R = val,或者在Matlab中更多“内置”的东西,它们通常不“喜欢”循环言。

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

有一个关于类似行为的主题,但在不同的语言中: Collapse a matrix to sum values in one column by values in another

2 个答案:

答案 0 :(得分:2)

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

d = accumarray(R, M, expected_size_of_d)

但是,如果您为MR以及预期的d提供示例值,那将非常有用,因为确切的解决方案可能取决于矩阵的形状,事实如果您使用线性索引或不...

答案 1 :(得分:0)

你的问题不是很清楚。如果您要对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