简体   繁体   中英

Block diagonal matrix from columns

Suppose I have an mxn matrix A .
Is there a way to create B , a (nxm) xn matrix whose "diagonal" is formed by A 's columns ?

Example:

A = [1 2;
     3 4]  

B = [1 0;
     3 0;
     0 2;
     0 4]

Here is a way:

  1. Convert A to a cell array of its columns, using mat2cell ;
  2. From that cell array generate a comma-separated list , and use it as an input to blkdiag .

Code:

A = [1 2; 3 4];                                   %// example data
C = mat2cell(A, size(A,1), ones(1,size(A,2)));    %// step 1
B = blkdiag(C{:});                                %// step 2

This produces

B =
     1     0
     3     0
     0     2
     0     4

Here is a short script to accomplish this. It works for any dimensions of A.

A=[1 2; 3 4];
[R C] = size(A);

for i=1:C
    B( 1+R*(i-1) : R*i , i ) = A(:,i);
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM