假設我有一個矩陣,第一列中的值可能會重複。如刪除矩陣中的重複項
1 2
3 4
5 6
1 3
Etc...
我想在重複加在一起成一排,與第二列是重複的行中的entires總和的矩陣。例如,上面的矩陣應該是
1 2+3
3 4
5 6
Etc...
任何想法如何完成此?嘗試編輯或將值複製到新矩陣中會更好嗎?
假設我有一個矩陣,第一列中的值可能會重複。如刪除矩陣中的重複項
1 2
3 4
5 6
1 3
Etc...
我想在重複加在一起成一排,與第二列是重複的行中的entires總和的矩陣。例如,上面的矩陣應該是
1 2+3
3 4
5 6
Etc...
任何想法如何完成此?嘗試編輯或將值複製到新矩陣中會更好嗎?
解決您的問題的方法是使用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
如果求和矩陣行的順序不重要和您只有整數值,您可以使用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
是的,這對整數有效。沒有特別的理由擔心行的順序;你可以按行排序,所以它不是問題。我想知道一個更通用的解決方案是什麼樣子,可以接受和處理浮點值。 –
@EliRiekeberg,我這樣做只是懶惰。處理浮動的標準方法是使用abs(m(:,1)-mvals(k))
標準的方法是使用'accumarray'。它在函數名稱中,它累積一個數組。如果你沒有可以用作索引的整數,那麼你使用'unique'的最終輸出來爲你創建它們。 – carandraug
accumarray ftw ;-) – Andy
我會辯論可讀性:)但它是適當的解決方案。但是,我也會辯論「甚至當你的數據不是整數時也能工作」。考慮矩陣乘法的輸出:在這種情況下,可以有許多「機器精度」相同的「唯一」值。這不是你通常想要的。 –
@AndrasDeak我會同意你的可讀性,直到我不得不使用它。現在很自然。在處理非整數時,第一列的值不同,因此不是unique(),因此是正確的。如果它們因浮點舍入問題而不同,則需要先處理它們(或者確實使用不同的方法),但這與這個問題是不同的問題。 – carandraug