2015-09-24 170 views
0

假設我有一個矩陣,第一列中的值可能會重複。如刪除矩陣中的重複項

1 2 
3 4 
5 6 
1 3 
Etc... 

我想在重複加在一起成一排,與第二列是重複的行中的entires總和的矩陣。例如,上面的矩陣應該是

1 2+3 
3 4 
5 6 
Etc... 

任何想法如何完成此?嘗試編輯或將值複製到新矩陣中會更好嗎?

回答

4

解決您的問題的方法是使用accumarray。這是將數值累加到一個新數組中的函數的用例。這將是比一個更快的循環和更具可讀性(當然,這是值得商榷的許多人也覺得很難,但一旦你瞭解它,它的死很容易,非常強大。):

octave> x = [1 2; 3 4; 5 6; 1 3]; 
octave> [y, ~, j] = unique (x(:,1)); 
octave> [y accumarray(j, x(:,2))] 
ans = 

    1 5 
    3 4 
    5 6 

注意上面即使你的數據不是整數,也可以工作。這是因爲我們正在使用unique(),j的最後一個輸出,它們是唯一值排列的索引y

octave> x = [1.1 2; 1.3 4; 1.5 6; 1.1 3]; 
octave> [y, i, j] = unique (x(:,1)); 
octave> [y accumarray(j, x(:,2))] 
ans = 

    1.1000 5.0000 
    1.3000 4.0000 
    1.5000 6.0000 
+0

accumarray ftw ;-) – Andy

+0

我會辯論可讀性:)但它是適當的解決方案。但是,我也會辯論「甚至當你的數據不是整數時也能工作」。考慮矩陣乘法的輸出:在這種情況下,可以有許多「機器精度」相同的「唯一」值。這不是你通常想要的。 –

+0

@AndrasDeak我會同意你的可讀性,直到我不得不使用它。現在很自然。在處理非整數時,第一列的值不同,因此不是unique(),因此是正確的。如果它們因浮點舍入問題而不同,則需要先處理它們(或者確實使用不同的方法),但這與這個問題是不同的問題。 – carandraug

1

如果求和矩陣行的順序不重要您只有整數值,您可以使用unique檢查第一列中的每個單獨值。像這樣:

m = [1 2; 3 4; 5 6; 1 3]; %original matrix 
mvals = unique(m(:,1)); %unique of first column 

mnew = zeros(length(mvals),size(m,2)); %preallocation 
for k=1:length(mvals) 
    mnew(k,:) = [mvals(k), sum(m(m(:,1)==mvals(k),2:end),1)]; %sum each row where first is mvals(k) 
end 
+0

是的,這對整數有效。沒有特別的理由擔心行的順序;你可以按行排序,所以它不是問題。我想知道一個更通用的解決方案是什麼樣子,可以接受和處理浮點值。 –

+0

@EliRiekeberg,我這樣做只是懶惰。處理浮動的標準方法是使用abs(m(:,1)-mvals(k))

+0

標準的方法是使用'accumarray'。它在函數名稱中,它累積一個數組。如果你沒有可以用作索引的整數,那麼你使用'unique'的最終輸出來爲你創建它們。 – carandraug