Текст подпрограммы и версий afp6r_c.zip , afp6d_c.zip , afp6c_c.zip |
Тексты тестовых примеров tafp6r_c.zip , tafp6d_c.zip , tafp6c_c.zip |
Приведение прямоугольной матрицы размера n*m (n ≥ m) к верхнему двухдиагональному виду преобразованиями вращения.
Для прямоугольной матрицы a paзмeра N*М (N ≥ М) строятся две последовательности матриц вращения R2 1, R3 1, ..., RN 1, ..., RM + 1 M, ..., RN M paзмepa N*N и Т2 3,Т2 4, ..., Т2 M, ..., ТM - 1 M размера М*М, такие, что
RN M ... R2 1 A T2 3 ... TM-1 M = D ,
где D - верхняя двухдиагональная матрица размера N*М. В pезультате двухдиагональная матрица D запоминается на месте соответствующих диагоналей матрицы А, а матрицы вращения Ri j, i = 2, 3, ..., N, j = 1, 2, ..., М, i > j и Тi j, i = 2, 3, 4, ..., М - 1, j = 3, 4, ..., М, i < j строятся следующим образом.
Матрицы Ri j и Ti 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 ), а информация о матрице Тi j - на месте элемента с индексами ( i - 1, j ).
В.В.Воеводин. Вычислительные основы линейной алгебры, М., Наука, 1977.
int afp6r_c (real *a, integer *n, integer *m)
Параметры
a - | двумерный массив размера n*m (n ≥ m), в котором задается исходная матрица A; в результате работы подпрограммы верхняя двухдиагональная матрица D запоминается на месте соответствующих диагоналей матрицы A, а матрицы вращения Ri j и Ti j упаковываются соответственно под и над верхней двухдиагональной частью матрицы A (тип: вещественный); |
n, m - | число строк и столбцов матрицы A, причем n ≥ m (тип: целый). |
Версии
afp6d_c - | приведение прямоугольной матрицы размера n*m (n ≥ m), заданной с двойной точностью, к верхнему двухдиагональному виду преобразованиями вращения. |
afp6c_c - | приведение комплексной прямоугольной матрицы размера n*m (n ≥ m) к верхнему двухдиагональному виду преобразованиями вращения. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В случае необходимости преобразования вектора матрицами вращения R2 1, R3 1, ..., Rn 1, ..., Rm+1 m, ..., Rn m или Tm - 1 m,Tm - 2 m, ..., T2 3, упакованными в матрице A описанным выше образом, можно воспользоваться соответственно подпрограммами am07r_c и am08r_c. | |
2. |
В подпрограмме afp6d_c параметр a имеет тип double. | |
3. |
В подпрограмме afp6c_c параметр a имеет тип complex. |
int main(void) { /* Initialized data */ static float a[15] /* was [5][3] */ = { 1.f,0.f,0.f,0.f,0.f,1.2f,-1.f, -.48f,0.f,.64f,1.6f,2.f,.36f,0.f,-.48f }; /* Local variables */ extern int afp6r_c(float *, int *, int *); static int i__; #define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6] afp6r_c(a, &c__5, &c__3); for (i__ = 1; i__ <= 5; ++i__) { printf("\n %15.7e %15.7e %15.7e \n", a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3)); } return 0; } /* main */ Результат: | 1 2 0.5 | | 0 1 2 | a_ref = | 0 0 1 | | 0 0 0 | | 0 0 0.5 | Это означает, что | 1 2 0 | | 0 1 2 | d = | 0 0 1 | | 0 0 0 | | 0 0 0 |