【问题标题】:MATLAB: Create a block diagonal matrix with same repeating blockMATLAB:创建具有相同重复块的块对角矩阵
【发布时间】:2013-05-04 03:44:55
【问题描述】:

我有一个尺寸为 n x n 的矩阵 K。我想创建一个尺寸为 N x N 的新块对角矩阵 M,使其包含 d 个矩阵块 K 作为它的对角线。

如果 d 更小,我会直接使用 M = blkdiag(K,K,K) 等。不幸的是,d 非常大,我不想手动编写具有 dblkdiag() 函数的参数完全相同的公式。

有没有更短、更智能的方法来做到这一点?

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    您可以为此使用kron

    M = kron(X,Y)
    

    返回 X 和 Y 的 Kronecker 张量积。结果是一个大数组,由 X 和 Y 的元素之间的所有可能的乘积形成。如果 X 是 m×n 并且 Y 是 p× q,则 kron(X,Y) 为 m*p×n*q。所以在你的情况下,这样的事情会做:

    M = kron(eye(L),K)
    

    L 是块数。

    【讨论】:

    • 感谢@natan 的提示。我尝试了几种组合,并认为以下为我提供了我正在寻找的东西 - M = kron(eye(d),K)
    【解决方案2】:
    tmp = repmat({K},d,1);
    M = blkdiag(tmp{:});
    

    你不应该使用 eval,或者不必要地进入 for 循环。 Kron 是一种非常优雅的方式。 只是想分享这个,因为它也有效。

    【讨论】:

    • 其实这比使用Kron快:K=rand(3);tic;G = kron(eye(2000),K);toc经过的时间是0.122015秒。 ` tic;tmp = repmat({K},2000,1);M = blkdiag(tmp{:});toc` 经过的时间是 0.036623 秒。
    【解决方案3】:

    以下应该有效:

    d=5; K=眼睛(3); T = 单元格(1,d);

    对于 j=1:d T{j} =K; 结束

    M = blkdiag(T{:})

    【讨论】:

      【解决方案4】:
      s = 'A,';
      s = repmat(s,[1,n2]);
      s = ['B=blkdiag(', s(1:end-1),');'];
      eval(s);
      

      它可以比使用 kron-eye 更快。

      【讨论】:

        【解决方案5】:

        “for”循环可能会有所帮助。喜欢:

        M = k;
        for i=1:N/n - 1
            M=blkdiag(M,k);
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多