Можно ли повернуть матрицу на 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