Текст подпрограммы и версий
amtgr_c.zip , amtgd_c.zip , amtgc_c.zip
Тексты тестовых примеров
tamtgr_c.zip , tamtgd_c.zip , tamtgc_c.zip

Подпрограмма:  amtgr_c

Назначение

Транспонирование прямоугольной матрицы на месте

Математическое описание

Транспонируемая прямоугольная матрица размеров М на N должна

Транспонируемая прямоугольная матрица размеров М на N должна быть представлена в оперативной памяти по столбцам в виде вектора А длины МN = М * N. Подпрограмма находит такие циклы перестановок элементов, что в результате в векторе А будет получена транспонированная матрица размеров N на М, расположенная также по столбцам.

Версия подпрограммы amtgr может быть использована также и для транспонирования прямоугольной матрицы, элементы которой имеют целый тип.

Сате Е.G., Тwigg D.W. Аnalysis of In - Situ Transposition. АCM Тransactions on Mathematical Software, Vol. 3, No. 1, 1977.

Использование

    int amtgr_c(real *a, integer *m, integer *n, integer *move,
        integer *iwrk, integer *ierr)

Параметры

a - вещественный вектор длины mn = m * n, в котором расположена транспонируемая прямоугольная матрица размеров m на n по столбцам;
m - число строк транспонируемой матрицы (тип: целый);
n - число столбцов транспонируемой матрицы (тип: целый);
move - целый вектор длины iwrk, используемый как рабочий;
iwrk - длина вектора move (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках в ходе работы подпрограммы; при этом:
ierr= -1    - если значение iwrk меньше 1;
ierr= -2    - если m или n меньше 1;
ierr=k>0 - если k - й цикл перестановок элементов был найден, но не выполнен.

Версии

amtgd_c - транспонирование прямоугольной матрицы на месте, элементы которой заданы с удвоенной точностью.
amtgc_c - транспонирование комплексной прямоугольной матрицы на месте.

Вызываемые подпрограммы

utam12_c - подпрограмма выдачи диагностических сообщений.

Замечания по использованию

  1. 

После работы подпрограммы исходная матрица не сохраняется.

  2.  Для ускорения работы подпрограммы рекомендуется брать значение iwrk равным (m + n) / 2.

Пример использования

int main(void)
{
    /* Initialized data */
    static int m = 3;
    static int n = 4;
    static int iwrk = 2;
    static float a[12] /* was [3][4] */ = { 11.f,21.f,31.f,12.f,22.f,32.f,
                                            13.f,23.f,33.f,14.f,24.f,34.f };
    /* Local variables */
    static int ierr, move[2], i__;
    extern int amtgr_c(float *, int *, int *, int *, int *, int *);

    for (i__ = 0; i__ <= 9; i__+=3) {
         printf("\n  %16.7e %16.7e %16.7e \n",
                a[i__], a[i__ + 1], a[i__ + 2]);
    }
    amtgr_c(a, &m, &n, move, &iwrk, &ierr);

    printf("\n  %5i \n", ierr);
    for (i__ = 0; i__ <= 9; i__+=3) {
         printf("\n  %16.7e %16.7e %16.7e \n",
                a[i__], a[i__ + 1], a[i__ + 2]);
    }
    return 0;
} /* main */


Результаты:

      ierr  =  0
      a  =  (11., 12., 13., 14., 21., 22., 23., 24., 31., 32., 33., 34.)