WG-
WG-

Reputation: 1070

How can I easily create this matrix?

How can I easily create the following matrix in MATLAB?

With A (nxn), B (nxp) and N a positive integer.

Gamma = [B         0         0         ...   0 ; 
         A*B       B         0         ...   0 ; 
         A^2*B     A*B       B         ...   0 ; 
         ...       ...       ...       ... ... ; 
         A^(N-1)*B A^(N-2)*B A^(N-3)*B ...   B];

Upvotes: 1

Views: 91

Answers (2)

Shai
Shai

Reputation: 114976

How about

[g{1:N,1:N}] = deal( zeros(n,p) );
g{1,1} = B;
for ii = 2:N
    g( ii, 2:end ) = g( ii-1, 1:end-1 );
    g{ ii, 1 } = A * g{ ii-1, 1 };
end
Gamma = cell2mat( g );

Upvotes: 3

Chris Taylor
Chris Taylor

Reputation: 47402

This works, though it is less efficient than it could be.

n = size(A,1);
p = size(B,2);

N = 3;
Gamma = zeros(N*n, N*p);

for ii = 1:N
  for jj = 1:N
    if ii >= jj
      Gamma((ii-1)*n+1:ii*n,(jj-1)*p+1:jj*p) = A^(ii-jj) * B;
    end
  end
end

Edit: Here's a more efficient version, that does the minimum amount of matrix multiplication.

n = size(A,1);
p = size(A,2);

N = 3;
Gamma = zeros(N*n, N*p);

# Pre-compute all the matrix multiplications we'll need.
memo = cell(1, N);
memo{1} = B;
for ii = 1:N-1
  memo{ii+1} = A * memo{ii};
end

for ii = 1:N
  for jj = 1:N
    if ii >= jj
      Gamma((ii-1)*n+1:ii*n,(jj-1)*p+1:jj*p) = memo{ii-jj+1};
    end
  end
end

Upvotes: 2

Related Questions