How to reshape a square matrix diagonally to a vector?
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
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 Commento
Walter Roberson
il 10 Set 2019
Are you working on DCT ? If so then https://www.mathworks.com/matlabcentral/fileexchange/15317-zigzag-scan
Risposta accettata
Stephen23
il 10 Set 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
Più risposte (1)
Johannes Fischer
il 10 Set 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
Vedere anche
Categorie
Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!