3

假设我在 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然后连接所有结果来做到这一点,但我正在寻找一种更短的方法来做到这一点。请分享你的想法。

4

3 回答 3

3
B = sparse( 1:numel(A), repmat( 1:size(A,2), [1 size(A,1)] ),...
            A(:), numel(A), size(A,2));

应该做的伎俩。

B = full(B);如果你想要一个完整的矩阵,你可以

于 2013-05-05T22:03:48.533 回答
3
B(repmat(eye(3),3,1)==1) = A;
reshape(B, [], 3)
于 2013-05-05T22:06:22.513 回答
3

这是使用线性索引的一种方法:

B(sub2ind([9 3], 1:9, mod(0:8,3)+1))=A;
reshape(B,9,3)

如果您希望这是通用的,请意识到原始的每一列都变成了对角线。因此,原来的行数变成了输出的列数,3rows 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;
于 2013-05-05T22:36:33.543 回答