Как-то раз мне попалась программа, написанная на MATLAB, в которой программист использовал функцию MATLAB под названием ROT90, которая поворачивает матрицу против часовой стрелки на 90, 180 или 270 градусов. Я подумал, что было бы интересно реализовать эту функцию MATLAB на языке SAS/IML.
Я не был уверен, как сделать это наиболее эффективно. Сначала я подумал о циклах. Но потом я понял, что повернуть матрицу можно с помощью трех простых операций с отражением: диагональные отражения, отражения вверх-вниз и отражения слева-направо. Отражение по диагонали — операция транспонирования матрицы. Отражение вверх-вниз эквивалентно отражению строк матрицы. Отражение слева-направо эквивалентно отражению столбцов матрицы. Каждую из этих операций легко реализовать, и, объединив две операции, вы можете реализовать поворот элементов матрицы.
Например, на рисунке показано, что поворот матрицы на 90 градусов эквивалентен отражению столбцов матрицы с последующим транспонированием матрицы. (Также можно сначала транспонировать, а затем обратить строки). Точно так же вы можете повернуть матрицу на 270 градусов, обратив строки и затем транспонировав матрицу. Наконец, вы можете повернуть матрицу на 180 градусов, обратив строки и столбцы. Следовательно, поворот матрицы выполняется с помощью следующих однострочных функций SAS/IML:
proc iml;
start Rot90(m);
return( T(m[,ncol(m):1]) ); /* left-right flip, then transpose */
finish;
start Rot180(m);
return( m[nrow(m):1,ncol(m):1] ); /* left-right flip, up-down flip */
finish;
start Rot270(m);
return( T(m[nrow(m):1,]) ); /* up-down flip, then transpose */
finish;
m = shape(1:20,5);
m90 = rot90(m);
m180 = rot180(m);
m270 = rot270(m);
print m m90 m180 m270;
Результат:
Реализация этих функций показывает, что иногда можно реализовать более сложное преобразование с помощью более простых преобразований.