2017-08-13 48 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