How to reshape a square matrix diagonally to a vector?
4 views (last 30 days)
Show older comments
Hello,
Suppose that we have the following 3x3 matrix:
A=[
0 1 0
1 1 1
1 1 0];
I need to reshape it to (010111101) where we read the matrix diagonaly from the extreme left of the top row (010) then we repeat this with the upper part (11) then the lower (11) and again from the left diagonal and the upper part is before the lower part (0) then (1) ==> 010111101. please see the attached figure.
So, How can I do that"
Regards,
1 Comment
Walter Roberson
on 10 Sep 2019
Are you working on DCT ? If so then https://www.mathworks.com/matlabcentral/fileexchange/15317-zigzag-scan
Accepted Answer
Stephen23
on 10 Sep 2019
>> A = [0,1,0;1,1,1;1,1,0]
A =
0 1 0
1 1 1
1 1 0
>> V = 1:sum(size(A))-1;
>> W = fix(V/2).*(-1).^V;
>> C = arrayfun(@(x)diag(A,x),W, 'uni',0);
>> Z = cat(1,C{:})
Z =
0
1
0
1
1
1
1
0
1
More Answers (1)
Johannes Fischer
on 10 Sep 2019
I would start with writing down the subscripts in the order you want to select the elements of the matrix.
A=[0 1 0;
1 1 1;
1 1 0];
row = [1 2 3 1 2 2 3 1 3];
col = [1 2 3 2 3 1 2 3 1];
If you need this for larger matrices I'm sure you'll be able to find an algorithm for NxN matrices
Having these coordinates, you can access the elements via their linear indices.
ind = sub2ind(size(A), row, col);
A(ind)
For a little more on the subject of matrix indexing, read here
See Also
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!