创建矩阵阶梯状附加块,例如楼梯MATLAB

时间:2019-01-04 13:57:19

标签: arrays matlab matrix

我想通过以下方式构建一个包含不同块的数组。 给定该块,我想重复该块n次,使其看起来像这样:

  A =  
  1  0  0 -1  0  0  0  0  0  1  0  0     
  0  1  0  0 -1  0  0  0  0  0  1  0  
  0  0  1  0  0 -1  0  0  0  0  0  1  

  and I want the Array look like this, n times repeating the scheme:

  newArray = 
  1  0  0 -1  0  0  0  0  0  1  0  0     
  0  1  0  0 -1  0  0  0  0  0  1  0  
  0  0  1  0  0 -1  0  0  0  0  0  1                
                             1  0  0 -1  0  0  0  0  0  1  0  0
                             0  1  0  0 -1  0  0  0  0  0  1  0
                             0  0  1  0  0 -1  0  0  0  0  0  1 
 and so on...

在可用空间为零的情况下,因为最终数组都应为稀疏数组。

如何在不使用循环的情况下重复并附加块?

2 个答案:

答案 0 :(得分:3)

就像您的示例一样,我假设每个块相对于纯块对角矩阵的向左偏移为A的行数。

您可以构建一个矩阵t,将其与A进行2D卷积得到如下结果:

A = [1 2 3 4; 5 6 7 8]; % data matrix
n = 3; % number of repetitions
[r, c] = size(A);
d = c-r;
t = zeros(r*(n-1)+1, d*(n-1)+1);
t(1:(r*(n-1)+1)*d+r:end) = 1;
result = conv2(t,A);

这给

A =
     1     2     3     4
     5     6     7     8

result =
     1     2     3     4     0     0     0     0
     5     6     7     8     0     0     0     0
     0     0     1     2     3     4     0     0
     0     0     5     6     7     8     0     0
     0     0     0     0     1     2     3     4
     0     0     0     0     5     6     7     8

答案 1 :(得分:3)

这是使用kron的解决方案:

n = 5; % number of repetitions
v = 3; % overlapping
s = size(A);

B = A(:,1:s(2)-v)
C = zeros(s(1),s(2)-v);
C(:,end-v+1:end) = A(:,end-v+1:end);

result = kron(eye(n) , B);
result(end,end+v)=0;
result(:,v+1:end) = result(:,v+1:end) + kron(eye(n) , C);

当矩阵大小较大时,可以使用稀疏矩阵:

n = 5;
v = 3; 
s = size(A);

B = sparse(A(:,1:s(2)-v));
C = sparse(s(1),s(2)-v);
C(:,end-v+1:end) = A(:,end-v+1:end);

result = kron(eye(n) , B);
result(end,end+v) = 0;
result(:,v+1:end) = result(:,v+1:end) + kron(eye(n) , C);