1

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

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

我通过以下方式实现它

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

就像@Andrew 在这个相关主题中建议的那样: 如何在 MATLAB 中遍历 n 维矩阵中的每个元素?

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

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

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

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

有一个关于类似操作但语言不同的主题: 折叠矩阵以将一列中的值与另一列中的值相加

4

2 回答 2

2

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

d = accumarray(R, M, expected_size_of_d)

M但是,如果您为我们提供andR和 expected 的示例值,这将很有用d,因为确切的解决方案可能取决于您的矩阵的形状,以及您是否使用线性索引的事实......

于 2013-09-16T12:44:10.013 回答
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
于 2013-09-16T14:26:43.590 回答