unblkdiag is used to detect and extract block-diagonal terms (typically used to reduce size of a semidefinite program)


Y = unblkdiag(X)


Create a block-diagonal matrix

A = sdpvar(2,2);
B = sdpvar(3,3);
C = diag(sdpvar(3,1));
X = blkdiag(A,B,C);

Now destroy the block-diagonal structure

p = randperm(8);
X = X(p,p);

The blocks are easily recovered (note that scalar terms are returned one by one)

blocks = unblkdiag(X)
  [3x3 sdpvar]  [1x1 sdpvar]  [2x2 sdpvar]  [1x1 sdpvar]  [1x1 sdpvar]

The command is most conveniently used on constraint lists (the function will go through all constraints and try to detect blocked SDP terms)

F = X>=0;
F = unblkdiag(F)
|   ID|      Constraint|                    Type|
|   #1|   Numeric value|   Matrix inequality 3x3|
|   #2|   Numeric value|   Matrix inequality 2x2|
|   #3|   Numeric value|        Element-wise 3x1|

Leave a Comment