Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to rotate a matrix by 45 degrees in matlab

i.e. so that it appears like a diamond. (it's a square matrix) with each row having 1 more element than the row before up until the middle row which has the number of elements equal to the dimensions of the original matrix, and then back down again with each row back to 1?

like image 282
Nermona Avatar asked Dec 04 '13 16:12

Nermona


1 Answers

A rotation is of course not possible as the "grid" a matrix is based on is regular.

But I remember what your initially idea was, so the following will help you:

%example data
A = magic(5);

A =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

d = length(A)-1;
diamond = zeros(2*d+1);

for jj = d:-2:-d

    ii = (d-jj)/2+1;
    kk = (d-abs(jj))/2;

    D{ii} = { [zeros( 1,kk ) A(ii,:) zeros( 1,kk ) ] };
    diamond = diamond + diag(D{ii}{1},jj);
end

will return the diamond:

diamond =

     0     0     0     0    17     0     0     0     0
     0     0     0    23     0    24     0     0     0
     0     0     4     0     5     0     1     0     0
     0    10     0     6     0     7     0     8     0
    11     0    12     0    13     0    14     0    15
     0    18     0    19     0    20     0    16     0
     0     0    25     0    21     0    22     0     0
     0     0     0     2     0     3     0     0     0
     0     0     0     0     9     0     0     0     0

Now you can again search for words or patterns row by row or column by column, just remove the zeros then:

Imagine you extract a single row:

row = diamond(5,:)

you can extract the non-zero elements with find:

rowNoZeros = row( find(row) )

rowNoZeros =

    11    12    13    14    15

Not a real diamond, but probably useful as well:

(Idea in the comments by @beaker. I will remove this part, if he is posting it by himself.)

B = spdiags(A)

B =

    11    10     4    23    17     0     0     0     0
     0    18    12     6     5    24     0     0     0
     0     0    25    19    13     7     1     0     0
     0     0     0     2    21    20    14     8     0
     0     0     0     0     9     3    22    16    15
like image 164
Robert Seifert Avatar answered Nov 04 '22 12:11

Robert Seifert