7
votes

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?

1
Are you asking about visualizing a matrix as a diamond?Eitan T
Matrix = imrotate(Matrix,45); With Image processing toolbox ?Vuwox
This is more to solve a wordsearch with strfind. It's easy for forwards and I use fliplr for backwards and ' for up and down. But I cannot see any way of doing the 4 diagonals except for rotating it 45 degrees and then doing forwards, backwards, up and down with that?Nermona
@AlexandreBizeau That's going to interpolate the values which may not be what the OP wants.beaker
maybe spdiags?beaker

1 Answers

10
votes

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