Текст подпрограммы и версий amtgr_p.zip , amtge_p.zip , amtgc_p.zip |
Тексты тестовых примеров tamtgr_p.zip , tamtge_p.zip , tamtgc_p.zip |
Транспонирование прямоугольной матрицы на месте.
Транспонируемая прямоугольная матрица размеров М на N должна быть представлена в оперативной памяти по столбцам в виде вектора А длины МN = М * N. Подпрограмма находит такие циклы перестановок элементов, что в результате в векторе А будет получена транспонированная матрица размеров N на М, расположенная также по столбцам.
Версия подпрограммы АМТGR может быть использована также и для транспонирования прямоугольной матрицы, элементы которой имеют целый тип.
Сате Е.G., Тwigg D.W. Аnalysis of In - Situ Transposition. АCM Тransactions on Mathematical Software, Vol. 3, No. 1, 1977.
procedure AMTGR(var A :Array of Real; M :Integer; N :Integer; var MOVE :Array of Integer; IWRK :Integer; var IERR :Integer);
Параметры
A - | вещественный вектор длины МN = М * N, в котором расположена транспонируемая прямоугольная матрица размеров М на N по столбцам; |
M - | число строк транспонируемой матрицы (тип: целый); |
N - | число столбцов транспонируемой матрицы (тип: целый); |
MOVE - | целый вектор длины IWRК, используемый как рабочий; |
IWRK - | длина вектора МОVЕ (тип: целый); |
IERR - | целая переменная, служащая для сообщения об ошибках в ходе работы подпрограммы; при этом: |
IЕRR= -1 - | если значение IWRК меньше 1; |
IЕRR= -2 - | если М или N меньше 1; |
IЕRR=К>0 - | если К - й цикл перестановок элементов был найден, но не выполнен. |
Версии
AMTGE - | транспонирование прямоугольной матрицы на месте, элементы которой заданы с расширенной (Extended) точностью. |
AMTGC - | транспонирование комплексной прямоугольной матрицы на месте. |
Вызываемые подпрограммы
UTAM12 - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию
1. |
После работы подпрограммы исходная матрица не сохраняется. | |
2. | Для ускорения работы подпрограммы рекомендуется брать значение IWRК равным (М + N) / 2. |
Unit tamtgr_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, AMTGR_p; function tamtgr: String; implementation function tamtgr: String; var IERR,_i :Integer; MOVE :Array [0..1] of Integer; const M :Integer = 3; N :Integer = 4; IWRK :Integer = 2; A :Array [0..11] of Real = ( 11.0,21.0,31.0,12.0,22.0,32.0,13.0,23.0,33.0, 14.0,24.0,34.0 ); begin Result := ''; Result := Result + Format('%s',[' A=']); Result := Result + #$0D#$0A; for _i:=0 to 11 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; AMTGR(A,M,N,MOVE,IWRK,IERR); Result := Result + Format('%s',[' IERR=']); Result := Result + Format('%5d ',[IERR]) + #$0D#$0A; Result := Result + Format('%s',[' A=']); Result := Result + #$0D#$0A; for _i:=0 to 11 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('tamtgr',Result); { вывод результатов в файл tamtgr.res } exit; end; end. Результаты: IERR = 0 A = (11., 12., 13., 14., 21., 22., 23., 24., 31., 32., 33., 34.)