How to create a specific diagonal Matrix

1 view (last 30 days)
Stefano Di Vito
Stefano Di Vito on 20 Apr 2018
Commented: Stephen23 on 20 Apr 2018
Hi everyone! I'm trying to find the way to write a generic code to obtain a matrix like the one in this example:
if true
A=[1 1 1 0 0 0 0 0 0;0 0 0 1 1 1 0 0 0;0 0 0 0 0 0 1 1 1]
end
To be clearer, i need a code to fill my matrix, which dimension is (T,T^2). In the example i have T=3. I need the general code because i need a matrix for each T i set, and it should respect the criteria of the example. This means that i have, for each row, a ones(1,T) vector that starts when the ones vector of the previous row ends. The first row should start with a ones(1,T) vector, as in the example. It is a sort of diagonal matrix i guess. I need it because it is part of the unequality constraints matrix in a linear program i'm developing. Hope someone could help me! thanks a lot in advance!

Answers (2)

Birdman
Birdman on 20 Apr 2018

Try this:

T=3;
for i=1:T
    A(i,:)=circshift([ones(1,T) zeros(1,T^2-T)],T*(i-1));
end

Stephen23
Stephen23 on 20 Apr 2018
Edited: Stephen23 on 20 Apr 2018

That is exactly what blkdiag is for:

>> V = [1,1,1];
>> blkdiag(V,V,V)
ans =
   1   1   1   0   0   0   0   0   0
   0   0   0   1   1   1   0   0   0
   0   0   0   0   0   0   1   1   1

This is much simpler and much more efficient than trying to write your own code using loops. Remember that MATLAB is a high-level language, so loops are often not the best solution.

  3 Comments
Sean de Wolski
Sean de Wolski on 20 Apr 2018
x = repmat({[ones(1, 3)]}, 1, 3)
blkdiag(x{:})

Sign in to comment.

Categories

Find more on Operating on Diagonal Matrices in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!