【问题标题】:Creating diagonal matrix from array of matrices in MATLAB从 MATLAB 中的矩阵数组创建对角矩阵
【发布时间】:2016-11-15 16:20:19
【问题描述】:

我对如何从矩阵数组创建对角矩阵感兴趣。 我在 MATLAB 中创建了一个矩阵数组:

X<62x62x1000> 它由 1000 个尺寸为 62x62 的矩阵组成

我想创建一个尺寸为 62000x62000 的矩阵,其中包含沿主对角线的数组 X 的 1000 个子矩阵。

除了M=blkdiag(X(:,:,1), X(:,:,2), X(:,:,3)...),你有任何线索可以做到这一点,因为那会写很多东西。

【问题讨论】:

标签: arrays matlab matrix diagonal


【解决方案1】:

一个可能的解决方案

M = kron(speye(1000),ones(62));
M(logical(M)) = X(:);

使用 kron 创建一个 62000*62000 稀疏矩阵 M,在其对角线上包含 1000 个块,然后将其替换为 X 的元素。

【讨论】:

    【解决方案2】:

    您可以使用(:) 索引将输入矩阵展平为列向量,然后将其传递给diag 以沿新矩阵的对角线放置这些元素。

    result = diag(X(:))
    

    这将以列优先顺序(MATLAB 的默认值)沿对角线对元素进行排序。如果您想要不同的排序,您可以使用permute 在展平之前重新排序尺寸。

    请务必注意,生成的矩阵将非常大。您可以改用spdiags 创建稀疏对角矩阵

    spdiags(X(:), 0, numel(X), numel(X))
    

    【讨论】:

      【解决方案3】:

      一个非常有争议的 eval 调用可以非常懒惰地解决这个问题,尽管我怀疑有更好的方法来做到这一点:

      evalstring = ['M=blkdiag('];
      for i = 1:999
          evalstring = [evalstring, 'X(:,:,', num2str(i),'),'];
      end
      evalstring = [evalstring, 'X(:,:,1000));'];
      eval(evalstring);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2012-03-16
        相关资源
        最近更新 更多