首页 > 解决方案 > 将 Matlab 中由相同整数索引的矩阵的列求和

问题描述

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

我考虑将我的两个问题合并为一个,因为我相信一旦我们学会了如何选择正确的列,这两种算法的解决方案应该是相似的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

标签: matlab

解决方案


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

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);

推荐阅读