从矩阵中删除重复项
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
假设我有一个矩阵,其中第一列中的值可能会重复。如
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