How to reshape a square matrix diagonally to a vector?

1 visualizzazione (ultimi 30 giorni)
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,

Risposta accettata

Stephen23
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
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

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!

Translated by