假设我在MATLAB中有一个矩阵,如
A = [1 2 3;
4 5 6;
7 8 9]
我希望获得格式
的矩阵B = [1 0 0;
0 4 0;
0 0 7;
2 0 0;
0 5 0;
0 0 8;
3 0 0;
0 6 0;
0 0 9]
即。矩阵,是三个对角矩阵的串联,每个矩阵在对角线上都有矩阵A
的列。我知道如何在for
的列上使用A
循环然后连接所有结果,但我正在寻找一种更短的方法来执行此操作。请分享您的想法。
答案 0 :(得分:3)
B = sparse( 1:numel(A), repmat( 1:size(A,2), [1 size(A,1)] ),...
A(:), numel(A), size(A,2));
应该这样做。
如果你想要一个完整的矩阵,你可以B = full(B);
答案 1 :(得分:3)
B(repmat(eye(3),3,1)==1) = A;
reshape(B, [], 3)
答案 2 :(得分:3)
这是一种使用线性索引的方法:
B(sub2ind([9 3], 1:9, mod(0:8,3)+1))=A;
reshape(B,9,3)
如果您希望这是通用的,请认识到原始的每一列都成为对角线。因此,原始行中的行数将成为输出中的列数,3 rows x cols
将成为行数。答案的其余部分根本没有改变:
c = size(A,1);
r = size(A,1) * size(A,2); #% or prod(size(A));
B(sub2ind([r c], 1:r, mod(0:(r-1),c)+1)) = A;