从矩阵

时间:2015-09-24 20:03:16

标签: octave

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

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

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

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

知道怎么做到这一点?尝试编辑或将值复制到新矩阵中会更好吗?

2 个答案:

答案 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