Текст подпрограммы и версий am14r_p.zip , am14e_p.zip , am14c_p.zip |
Тексты тестовых примеров tam14r_p.zip , tam14e_p.zip , tam14c_p.zip |
Преобразование вектора последовательностью матриц отражения, упакованных над главной диагональю прямоугольной матрицы размера N * M (N ≥ M).
Подпрограмма AM14R вычисляет произведение
Q1 Q2 ... QM-1В ,
где Q1, Q2,..., QM - 1 - матрицы отражения размера M * M, B - заданный вектор длины M. Матрицы отражения Qi имеют вид
Qi = Е - Wi WiH ,
где Е - единичная матрица размера M * M,
Wi - вектор длины M, первые i компонент
которого равны нулю.
Ненулевые компоненты векторов
Wi, порождающих матрицы Qi,
задаются в строках над главной диагональю прямоугольной матрицы А
размера N * М (N ≥ М),
т.е.
Wi = ( 0, 0, ... , 0, ai, i+1, ai, i+2, ... , ai, M )H .
Данная упаковка последовательности матриц отражения получается, например, в результате работы подпрограммы, реализующей приведение прямоугольной матрицы А размера N * М (N ≥ М) к верхнему двухдиагональному виду (AFP4R) методом отражений.
procedure AM14R(var A :Array of Real; N :Integer; M :Integer; var B :Array of Real);
Параметры
A - | вещественный двумерный массив размера N * М, в котором в упакованном виде хранится информация о матрицах отражения; |
N, M - | число строк и столбцов матрицы А соответственно, N ≥ М (тип: целый); |
B - | вещественный одномерный массив длины M, в котором задается исходный вектор B; в результате работы подпрограммы на месте B запоминается преобразованный вектор Q1 Q2 ... QM - 1 В. |
Версии
AM14E - | преобразование вектора последовательностью матриц отражения, упакованных над главной диагональю прямоугольной матрицы размера N * М (N ≥ М), с расширенной (Extended) точностью. |
AM14C - | преобразование комплексного вектора последовательностью комплексных матриц отражения, упакованных над главной диагональю прямоугольной матрицы размера N * М (N ≥ М). |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
В подпрограмме АМ14E параметры А и B имеют тип Extended. | |
2. | В подпрограмме AM14C параметры А и B имеют тип Complex. |
Unit tam14r_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, AFP4R_p, AM14R_p; function tam14r: String; implementation function tam14r: String; var _i :Integer; D1 :Array [0..4] of Real; D2 :Array [0..3] of Real; const A :Array [0..19] of Real = ( 1.0,3.0,0.0,-1.0,1.0,3.0,3.0,-2.0,0.0,1.0,1.0, -5.0,1.0,1.0,1.0,1.0,1.0,5.0,-3.0,1.0 ); X :Array [0..3] of Real = ( 1.0,-2.0,0.0,3.0 ); begin Result := ''; Result := Result + #$0D#$0A; for _i:=0 to 19 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; Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[X[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; AFP4R(A,5,4,D1,D2); Result := Result + #$0D#$0A; for _i:=0 to 19 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; AM14R(A,5,4,X); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[X[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('tam14r',Result); { вывод результатов в файл tam14r.res } exit; end; end. Результат: B = ( 1.00000, - 0.51676, - 1.62275, 3.17799 )