用 Matlab 对角扩展矩阵

m20*_*16b 5 arrays matlab matrix

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

在此处输入图片说明

例如 :

如果我有一个矩阵B = [1 1 ; 1 1 ; 1 1]B0 = [1 1]B1 = [1 1]B2 = [1 1],并且每个B0 , B1 , B2维度12k = 2L = 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]和维数 6由 给出8

在此处输入图片说明

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

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

我的代码:

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
Run Code Online (Sandbox Code Playgroud)

结果 : 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
Run Code Online (Sandbox Code Playgroud)

我有困难概括为任何给定矩阵B和任何价值kL

有什么建议?

Lui*_*ndo 4

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
Run Code Online (Sandbox Code Playgroud)

倒数第二行使用线性索引。最后一行应用二维卷积。本例中的结果是

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
Run Code Online (Sandbox Code Playgroud)