2017-08-13 82 views
2

假设我们有一个矩阵添加行向量到矩阵的多行,重复的行索引

A = [1,2;3,4;5,6] 
1 2 
3 4 
5 6 

我知道,MATLAB允许添加矢量多行,例如,

A([1,2],:) = A([1,2],:) + [1,1]; 

然后

A = 
    2 3 
    4 5 
    5 6 

然而,A([1,2,1],:) + [1,1]给出相同的结果

A([1,2,1],:) = A([1,2,1],:) + [1,1]; 

然后

A = 
    2 3 
    4 5 
    5 6 

这是不是我想要的。该预期效果是增加[1,1]第一行两次,预期的结果是,

A([1,2,1],:) = A([1,2,1],:) + [1,1]; 

和A应该是

A = 
    3 4 
    4 5 
    5 6 

如何实现这一目标?谢谢!

回答

2

这不能通过花哨索引来实现。 Matlab的将首先评估右手边,这对于A([1,2,1],:) + [1,1];

2 3 
4 5 
2 3 

,然后将其分配到左边的矩阵。首先,A(1,:)被替换为[2 3],然后A(2,:)被替换为[4 5],然后A(1,:)被替换为[ 2 3] 再次(浪费时间)。 A的新赋值绝不能在同一赋值的右边再次立即使用。

相反,如果你要开始使用具有重复索引列表,下面的工作:

ix = [1 2 1] 
uix = unique(ix) 
counts = hist(ix, uix) 
A(uix, :) = A(uix, :) + counts' * [1 1] 

这导致

A =  
    3 4 
    4 5 
    5 6