Пользователю SAS понадобилось преобразовать программу из языка MATLAB в язык SAS/IML, и он спросил, есть ли в SAS/IML функции, эквивалентные функциям fliplr и flipud в MATLAB. Эти функции отражают столбцы или строки матрицы; "LR" означает "слева-направо", а "UD" — "сверху-вниз".

Нет, в SAS/IML нет эквивалентных встроенных функций, но как когда-то пела группа Devo: "Если у вас возникла проблема, ее нужно решить". В этой статье показано, как реализовать эти функции в SAS/IML. Или, перефразируя принцип, воспетый группой Devo: "Если у вас есть матрица, ее нужно отразить. Отразить ее никогда не поздно. Отразите ее как следует."

Функции FLIPLR и FLIPUD в SAS/IML

Ключом к обращению столбцов или строк матрицы является использование обозначения индекса. Напомним, что в языке SAS/IML выражение A [, 1] извлекает первый столбец A. (Если индекс строки не указан, это означает "использовать все строки"). Аналогично, A [, 1:3] извлекает первые три столбца A (по порядку), а A [, 3:1] извлекает первые три столбца A в обратном порядке. Аналогичная запись действительна и для строк. Выражение A [3:1, ] извлекает первые три строки A в обратном порядке. Следующие функции SAS/IML реализуют функциональность функций fliplr и flipud для матриц:

proc iml;
/* reverse columns of a matrix */
start fliplr(A);
   return A[ , ncol(A):1];
finish;
 
/* reverse rows of a matrix */
start flipud(A);
   return A[nrow(A):1, ];
finish;
 
/* test the functions on a 2x3 matrix */
x = {1 2 3, 4 5 6};
lr = fliplr(x);
ud = flipud(x);
print x, lr, ud;

Реверсирование всех элементов

Вы также можете реверсировать все элементы матрицы. Напомним, что матрица SAS/IML хранится в памяти по строкам, т.е. сначала элементы первой строки по порядку, затем элементы второй строки по порядку и т.д. Таким образом, если размер матрицы A — n x m, то A [n*m:1] возвращает элементы A в обратном порядке. Однако элементы возвращаются в векторе столбца. Если вы хотите, чтобы элементы в матрице имели те же размерности, что и A, вы можете "сформировать элементы", используя функцию SHAPE следующим образом:

/* reverse elements of a matrix */
start reverse(A);
   n = nrow(A); m = ncol(A);
   return shape(A[n*m:1], n, m);     /* Now flip it into SHAPE */
finish;
 
rev = reverse(x);
print rev;

Язык MATLAB также поддерживает функцию rot90, которая вращает матрицу. Ранее я показывал, как повернуть элементы матрицы на языке SAS/IML.

Итак, хотя SAS/IML не содержит встроенных функций для реверсирования строк и столбцов матрицы, эти функции легко реализовать с помощью операций с индексами. Короче говоря, если у вас есть матрица, реверсировать ее несложно.

Оригинал статьи на английском