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

后端 未结 1 933
无人及你
无人及你 2021-01-02 16:31

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 eleme

相关标签:
1条回答
  • 2021-01-02 17:04

    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
    
    0 讨论(0)
提交回复
热议问题