将以相同整数索引的Matlab中矩阵的列的总和

时间:2018-08-31 18:37:01

标签: matlab

我在Matlab中有一个矩阵A。我希望您能帮助您找到

  • 算法将由同一整数索引的A的列相加。

  • 算法删除由相同整数索引的A的列,而代之以零列。

我考虑过将两个问题合为一体,因为我相信一旦我们学会了如何选择A的正确列,两种算法的解决方案就应该相似。

让我用一个例子更好地解释。

clear 
b=8;
g=3;

B=[1;2;2;2;3;4;4;5]; %bx1
bnew=size(unique(B),1); 

A=[1  2  3  4  5  6  7  8;
   9  10 11 12 13 14 15 16;
   17 18 19 20 21 22 23 24]; %gxb

关于第一种算法:矩阵B告诉我们A的哪些列应相互求和。例如:B的第二,第三和第四元素相等;这意味着A的第二,第三和第四列应加起来。

关于第二种算法:矩阵B告诉我们A的哪些列应删除并替换为零列。例如:B的第二,第三和第四元素相等;这意味着应该删除A的第二,第三和第四列,并添加一列零。

请务必注意,要汇总或删除的列始终相邻。换句话说,我们不能拥有例如

B=[1;2;2;2;3;2;4;5];

这些是我想要获得的矩阵,我找不到方法。

Matrixdesired1=[1  2+3+4    5  6+7    8;
               9   10+11+12 13 14+15 16;
               17  18+19+20 21 22+23 24]; %gxbnew


Matrixdesired2=[1  0  5   0  8;
                9  0  13  0  16;
                17 0  21  0  24]; %gxbnew

3 个答案:

答案 0 :(得分:3)

使用矩阵乘法的解决方案:

C = B == 1:B(end);
Matrixdesired1 = A * C;

Matrixdesired2 = Matrixdesired1;
Matrixdesired2(:, sum(C) > 1) = 0;

Matrixdesired2 = Matrixdesired1 .* (sum(C) <= 1);

这里C[b * bnew]的二进制矩阵。如果它消耗大量内存,则可以创建一个稀疏矩阵并检查其效率:

C=sparse(1:numel(B),B,1);

答案 1 :(得分:1)

您可以通过一个简单的循环来实现

b = b(:)'; % b should be a row vector
ub = unique(b);
out = zeros( size(A,1), numel(ub) );
for ii = 1:numel(ub)
    out(:,ii) = sum( A(:, b==ub(ii)), 2 );
end 

如果您想将该列保持为零,只需测试numel(b==ub(ii)) > 1是否在这种情况下不要求和。

答案 2 :(得分:1)

对于第一个问题,您可以对accumarray使用单线。

B=[1;2;2;2;3;4;4;5]; 

A=[1  2  3  4  5  6  7  8;
   9  10 11 12 13 14 15 16;
   17 18 19 20 21 22 23 24];

Matrixdesired1 = cell2mat(arrayfun(@(x) accumarray(B,A(x,:)),1:size(A,1),'un',0)).'

对于第二个问题,可以结合使用finddiff

B=[1;2;2;2;3;4;4;5]; 

A=[1  2  3  4  5  6  7  8;
       9  10 11 12 13 14 15 16;
       17 18 19 20 21 22 23 24];

indx = find(diff(B.')==0);
A(:,indx+1)=zeros(size(A,1),numel(indx));
A(:,indx) = [];
Matrixdesired2 = A