Текст подпрограммы и версий afp8r_c.zip , afp8d_c.zip , afp8c_c.zip |
Тексты тестовых примеров tafp8r_c.zip , tafp8d_c.zip , tafp8c_c.zip |
Приведение прямоугольной матрицы A размера n*m (n ≥ m) к верхнему треугольному виду преобразованиями вращения.
Для прямоугольной матрицы A paзмeра N*М (N ≥ М) строится последовательность матриц вращения R2 1,R3 1, ..., RN M paзмера N*N такая, что
RN M ... R2 1A = L ,
где L - верхняя треугольная матрица размера N*М. В результате верхняя треугольная матрица L запоминается на месте соответствующих элементов матрицы А.
Матрицы Ri j, i = 2, ..., N, j = 1, ..., М, i > j, являющиеся матрицами плоского вращения в плоскости ( i, j ), у которых элементы Ri i = Rj j = C, Ri j = - S, Rj i = S, а остальные элементы главной диагонали равны 1, свертываются в число t = S / (1 + С), по которому они восстанавливаются с помощью формул
C = (1 - | t |2) / (1 + | t |2) , S = 2t / (1 + | t |2) ,
и упаковываются под верхней треугольной частью матрицы А : информация о матрице Ri j запоминается на месте элемента с индексами ( i, j ).
В.В.Воеводин, Вычислительные основы линейной алгебры, М., Наука, 1977.
int afp8r_c (real *a, integer *n, integer *m)
Параметры
a - | двумерный массив размера n*m (n ≥ m), в котором задается исходная матрица A; в результате работы подпрограммы верхняя треугольная матрица L запоминается на месте соответствующих элементов матрицы A, а матрицы вращения Ri j упаковываются под верхней треугольной частью матрицы A (тип: целый); |
n, m - | число строк и столбцов матрицы A, причем n ≥ m (тип: целый). |
Версии
afp8d_c - | приведение прямоугольной матрицы размера n*m (n ≥ m) заданной с двойной точностью, к верхнему треугольному виду преобразованиями вращения. |
afp8c_c - | приведение прямоугольной комплексной матрицы размера n*m (n ≥ m) к верхнему треугольному виду преобразованиями вращения. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В случае надобности преобразования вектора матрицами вращения R2 1,R3 1,...,Rn m, упакованными в матрице a описанным выше способом, можно воспользоваться подпрограммой am07r_c. | |
2. |
В подпрограмме afp8d_c параметр a имеет тип double. | |
3. | В подпрограмме afp8c_c параметр a имеет тип complex. |
int main(void) { /* Initialized data */ static float a[15] /* was [5][3] */ = { .6f,.8f,0.f,0.f,0.f,.4f,2.2f,0.f, 0.f,0.f,2.6f,6.8f,.6f,.8f,0.f }; /* Local variables */ extern int afp8r_c(float *, int *, int *); static int i__; #define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6] afp8r_c(a, &c__5, &c__3); for (i__ = 1; i__ <= 5; ++i__) { printf("\n %16.7e %16.7e %16.7e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3)); } return 0; } /* main */ Результат: | 1 2 7 | | -0.5 1 2 | a_ref = | 0 0 1 | | 0 0 -0.5 | | 0 0 0 | Это означает, что | 1 2 7 | | 0 1 2 | l = | 0 0 1 | | 0 0 0 | | 0 0 0 |