Можно ли повернуть матрицу на 45 градусов в MATLAB

т. е. Так, что он выглядит как алмаз. (это квадратная матрица) с каждой строкой, имеющей на 1 элемент больше, чем строка до средней строки, которая имеет количество элементов, равное размерам исходной матрицы, а затем обратно вниз с каждой строкой обратно в 1?

1 ответов


вращение, конечно, невозможно, поскольку "сетка", на которой основана матрица, является регулярной.

но я помню, что ваша первоначальная идея была, поэтому вам поможет следующее:

%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

вернет алмазов:

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

теперь вы можете снова искать слова или шаблоны строка за строкой или столбец за столбцом, просто удалите нули:

представьте, что вы извлекаете одну строку:

row = diamond(5,:)

вы можете извлечь ненулевые элементы с find:

rowNoZeros = row( find(row) )

rowNoZeros =

    11    12    13    14    15

не настоящий алмаз, но, вероятно, также полезно:

(идея в комментариях @beaker. Я удалю эту часть, если он разместит ее сам.)

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