【问题标题】:Matrix to Diagonal Matrix in MATLAB [duplicate]MATLAB中的矩阵到对角矩阵[重复]
【发布时间】:2017-11-16 22:42:33
【问题描述】:

假设我在 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 的列。我知道如何在A 的列上使用for 循环然后连接所有结果,但我正在寻找一种更短的方法来做到这一点。请分享您的想法。

【问题讨论】:

    标签: matlab matrix diagonal


    【解决方案1】:
    B(repmat(eye(3),3,1)==1) = A;
    reshape(B, [], 3)
    

    【讨论】:

    • 我想应该是repmat(eye(3),3,1)...
    • @tmpearce 是的,我会编辑。
    • @Shai You 这样做,否则它作为一个向量出来
    • 如果 A 是维度 (x,y) 的矩阵会怎样?
    • @Erol 如果 x 和 y 不同,那么您需要重新定义您的探针,否则只需将所有 3s 替换为 n 以便 n = size(A, 1)
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 如果 A 是维度 (x,y) 的矩阵会怎样?
    • @erol 查看编辑:它很容易概括
    • 谢谢。你的也可以,但我不得不接受一个,所以我选择了一个最容易理解的。
    【解决方案3】:
    B = sparse( 1:numel(A), repmat( 1:size(A,2), [1 size(A,1)] ),...
                A(:), numel(A), size(A,2));
    

    应该可以解决问题。

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

    【讨论】:

    • 如果 A 是维度 (x,y) 的矩阵会怎样?
    • @Erol 你试过任意A 的代码吗?该解决方案应该适用于任何A
    • 谢谢。你的也可以,但我不得不接受一个,所以我选择了一个最容易理解的。
    • @Erol - 很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多