从矩阵中删除重复项

Removing Duplicates from a Matrix

假设我有一个矩阵,其中第一列中的值可能会重复。如

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

我想得到一个矩阵,其中重复项加在一起成为一行,第二列是重复行中所有项的总和。例如上面的矩阵应该是

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

知道如何完成这个吗?尝试就地编辑或将值复制到新矩阵会更好吗?

如果求和矩阵的行顺序无关紧要并且你只有整数值,你可以使用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

您的问题的解决方案是使用 accumarray。这个,在新数组中累积值,是该函数的用例。它将比 for 循环快得多并且可读性更好(好吧,这是有争议的。很多人也觉得它很困难,但是一旦你理解了它,它就非常简单而且非常强大):

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