【问题标题】:Expanding a matrix diagonally with Matlab用 Matlab 对角展开矩阵
【发布时间】:2020-11-11 23:17:58
【问题描述】:

我有一个矩阵B,我想通过L*n 获得一个维度为(L+k)*m 的矩阵C。 L 和 k 是输入值。 B0 , B1 , ... , Bk 的大小为 m n。

例如:

如果我有一个矩阵B = [1 1 ; 1 1 ; 1 1] 与B0 = [1 1]、B1 = [1 1] 和B2 = [1 1],并且每个B0 , B1 , B2 的维度为1 由2 与k = 2 和L = 4。

那么得到的矩阵C由C = [1 1 0 0 0 0 0 0 ; 1 1 1 1 0 0 0 0 ; 1 1 1 1 1 1 0 0 ; 0 0 1 1 1 1 1 1 ; 0 0 0 0 1 1 1 1 ; 0 0 0 0 0 0 1 1]给出,维度为 68。

我想将我的程序推广到任何大小的矩阵B。

我的程序用m = 1、n = 2、k = 2和L = 4解决了B = [1 1 ; 1 1 ; 1 1]的问题。

我的代码:

clc;
clear;

k = 2;                    
L = 4;                   

B = [1 1 ; 1 1 ; 1 1];    
B0 = [1 1];
B1 = [1 1];
B2 = [1 1];
m = size(B0,1);
n = size(B0,2);

c = [B ; zeros(size(B))];
C = zeros((L+k)*m,L*n);

for i = 1:L
    
    C(:,2*i-1:2*i) = circshift(c,i-1,1);
    
end

结果:C =

1   1   0   0   0   0   0   0
1   1   1   1   0   0   0   0
1   1   1   1   1   1   0   0
0   0   1   1   1   1   1   1
0   0   0   0   1   1   1   1
0   0   0   0   0   0   1   1

对于任何给定的矩阵B 以及k 和L 的任何值,我都难以概括。

有什么建议吗?

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:
    B = [1 2 3; 4 5 6; 7 8 9; 100 110 120; 130 140 150; 160 170 180];  % input
    L = 4;                                                             % input
    k = 2;                                                             % input
    m = size(B,1)/(k+1);              % obtain m
    n = size(B,2);                    % obtain n
    C = zeros((L-1)*m+1, (L-1)*n+1);  % initiallize result
    C(1:((L-1)*m+1)*n+m:end) = 1;     % each 1 marks the upper-left corner for a copy of B
    C = conv2(C, B);                  % insert copies of B, extending size
    

    倒数第二行使用linear indexing。最后一行适用two-dimensional convolution。这个例子的结果是

    B =
         1     2     3
         4     5     6
         7     8     9
       100   110   120
       130   140   150
       160   170   180
    
    C =
         1     2     3     0     0     0     0     0     0     0     0     0
         4     5     6     0     0     0     0     0     0     0     0     0
         7     8     9     1     2     3     0     0     0     0     0     0
       100   110   120     4     5     6     0     0     0     0     0     0
       130   140   150     7     8     9     1     2     3     0     0     0
       160   170   180   100   110   120     4     5     6     0     0     0
         0     0     0   130   140   150     7     8     9     1     2     3
         0     0     0   160   170   180   100   110   120     4     5     6
         0     0     0     0     0     0   130   140   150     7     8     9
         0     0     0     0     0     0   160   170   180   100   110   120
         0     0     0     0     0     0     0     0     0   130   140   150
         0     0     0     0     0     0     0     0     0   160   170   180
    

    【讨论】:

    • 这正是我想要的。谢谢@Luis Mendo。
    • 嗨 Luis,我建议进行一些小修改以考虑size(B,1)/(k+1) 不输出整数的情况。您最终可以在答案中添加此选项,以便我可以删除我的提议。
    • @obchardon Nah,我认为最好保留您的答案。此外,它使用不同的方法(sparse)来创建 0-1 矩阵
    【解决方案2】:

    除了@LuisMendo 的回答:

    如果size(B,1)/(k+1) 不产生整数,那么他的解决方案可能会失败。

    我建议用sparse() 创建C 矩阵:

    n = size(B,2)
    C = full(sparse(1:k:k*L,1:n:n*L,1))
    

    所以整个代码变成:

    B = ones(7,3);                       % An input matrix that will produce an error with the linear indexing solution. 
    L = 6;                               % number of repetition
    k = 2;                               % row-shift
    n = size(B,2);                       % obtain n
    C = full(sparse(1:k:k*L,1:n:n*L,1)); % Create C using full(sparse())
    C = conv2(C, B)                      % insert copies of B, extending size
    

    (所有的创意都归功于 LuisMendo)

    【讨论】:

      【解决方案3】:

      这个解决方案作为@obchardon 的答案使用sparse,但与@LuisMendo 的答案不同的是不使用conv2。块的索引被计算并在sparse 中使用以形成所需的矩阵。

          [row col] = find(true(size(B)));
          ROW = row + (0:L-1)*k;
          COL = col + (0:L-1)*size(B,2);
          C = sparse (ROW, COL, repmat (B, 1, L));
      

      【讨论】:

      • 最简单的解决方案!很不错
      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多