我想根据矩阵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
答案 0 :(得分:2)
这可能是使用Matlab的accumarray
函数完成的。像这样:
d = accumarray(R, M, expected_size_of_d)
但是,如果您为M
和R
以及预期的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