Nermona
Nermona

Reputation: 137

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?

Upvotes: 7

Views: 13085

Answers (1)

Robert Seifert
Robert Seifert

Reputation: 25232

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

Upvotes: 10

Related Questions