2013-09-16 71 views
1

我想根据矩阵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比如你有一个“内置”的方法来瓦解一个列的重复和获取值的总和其他列。

有一个关于类似的行动,但在不同的langauge话题: Collapse a matrix to sum values in one column by values in another

+0

请给出一些R和M以及期望输出的最小例子。 –

回答

2

这是可能的,这可以使用Matlab的accumarray函数来完成。事情是这样的:

d = accumarray(R, M, expected_size_of_d) 

但是,如果你给我们MR和预期d示例值将是有益的,因为准确的解决方案可能取决于你的矩阵形状,事实上,如果你使用的线性索引或不...

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 
相关问题