Текст подпрограммы и версий am09r_p.zip , am09e_p.zip , am09c_p.zip |
Тексты тестовых примеров tam09r_p.zip , tam09e_p.zip , tam09c_p.zip |
Левосторонние преобразования вектора последовательностью матриц вращения, упакованных под нижней двухдиагональной частью прямоугольной матрицы размера N * M (N ≤ M).
Вектор B длины N последовательно умножается слева на матрицы
вращения R3 2, R4 3,
..., RN N - 1, упакованные
под нижней двухдиагональной частью заданной прямоугольной матрицы А
размера N * М (N ≤ М)
таким образом,
что если t = А (i, j-1) для
i > j , то матрица Ri j
размера N*N является марицей плоского вращения в плоскости
(i, j), у которой элементы Ri i =
Rj j = С,
Ri j = - S,
Rj i = S, а остальные элементы главной
диагонали равны 1,
где
С = (1 - | t |2) / (1 + | t |2) ,
S = 2t / (1 + | t |2).
procedure AM09R(var A :Array of Real; N :Integer; M :Integer; var B :Array of Real);
Параметры
A - | двумерный массив размера N * М, содержащий прямоугольную матрицу, под нижней двухдиагональной частью которой хранится в упакованном виде последовательность матриц вращения (тип: вещественный); |
N, M - | число строк и столбцов матрицы А, причем N ≤ М (тип: целый); |
B - | одномерный массив длины N, в котором задается исходный вектор; в результате работы подпрограммы на месте B запоминается преобразованный вектор (тип: вещественный). |
Версии
AM09E - | левосторонние преобразования вектора последовательностью матриц вращения с расширенной (Extended) точностью. |
AM09C - | левосторонние преобразования комплексного вектора последовательностью комплексных матриц вращения. |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
Заданная в необходимой форме последовательность матриц вращения, используемых данной подпрограммой, получается, например, в результате работы подпрограммы, реализующей приведение прямоугольной матрицы размера N на М (N ≤ М) к нижнему треугольному виду (АFР7R). | |
2. |
В подпрограмме АМ09E параметры А и B имеют тип Extended. | |
3. | В подпрограмме AM09C параметры А и B имеют тип Complex. |
Unit tam09r_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, AM09R_p; function tam09r: String; implementation function tam09r: String; var _i :Integer; const A :Array [0..19] of Real = ( 0.0,0.0,0.5,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0, 0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.5 ); B :Array [0..3] of Real = ( 1.0,1.0,1.0,1.0 ); begin Result := ''; AM09R(A,4,5,B); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[B[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; 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; UtRes('tam09r',Result); { вывод результатов в файл tam09r.res } exit; end; end. Результат: В = ( 1.0, - 1.0, 0.2, 1.4 )