MATLAB中的矩阵到对角矩阵

时间:2013-05-05 21:57:01

标签: matlab matrix diagonal

假设我在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循环然后连接所有结果,但我正在寻找一种更短的方法来执行此操作。请分享您的想法。

3 个答案:

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