Текст подпрограммы и версий amtgr_c.zip , amtgd_c.zip , amtgc_c.zip |
Тексты тестовых примеров tamtgr_c.zip , tamtgd_c.zip , tamtgc_c.zip |
Транспонирование прямоугольной матрицы на месте
Транспонируемая прямоугольная матрица размеров М на 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.)