我在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
答案 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)).'
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