Создайте матрицу, прикрепляющую блоки по блокам, как по лестнице MATLAB - PullRequest
0 голосов
/ 04 января 2019

Я хочу построить массив, содержащий различные блоки, следующим образом. Для данного блока я хочу повторить блок 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 голосов
/ 04 января 2019

Вот решение с использованием 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);
0 голосов
/ 04 января 2019

Я предполагаю, что смещение влево каждого блока относительно чистой блок-диагональной матрицы - это количество строк A, как в вашем примере.

Вы можете построить матрицу t, что 2D-свертка с A дает результат следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...