假设我有一个矩阵,第一列中的值可能会重复。如
1 2
3 4
5 6
1 3
Etc...
我想得到一个矩阵,其中重复项一起添加到一行,第二列是重复行中的entires的总和。例如,上面的矩阵应该是
1 2+3
3 4
5 6
Etc...
知道怎么做到这一点?尝试编辑或将值复制到新矩阵中会更好吗?
答案 0 :(得分:4)
问题的解决方案是使用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 :(得分: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