Текст подпрограммы и версий am14r_c.zip , am14d_c.zip , am14c_c.zip |
Тексты тестовых примеров tam14r_c.zip , tam14d_c.zip , tam14c_c.zip |
Преобразование вектора последовательностью матриц отражения, упакованных над главной диагональю прямоугольной матрицы размера N * M (N ≥ M).
Подпрограмма am14r_c вычисляет произведение
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_c) методом отражений.
int am14r_c (real *a, integer *n, integer *m, real *b)
Параметры
a - | вещественный двумерный массив размера n * m, в котором в упакованном виде хранится информация о матрицах отражения; |
n, m - | число строк и столбцов матрицы A соответственно, n ≥ m (тип: целый); |
b - | вещественный одномерный массив длины m, в котором задается исходный вектор B; в результате работы подпрограммы на месте b запоминается преобразованный вектор Q1 Q2 ... Qm - 1 B. |
Версии
am14d_c - | преобразование вектора последовательностью матриц отражения, упакованных над главной диагональю прямоугольной матрицы размера N * M (N ≥ M), с повышенной точностью. |
am14c_c - | преобразование комплексного вектора последовательностью комплексных матриц отражения, упакованных над главной диагональю прямоугольной матрицы размера N * M (N ≥ M). |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
В подпрограмме am14d_c пapaмeтpы a и b имeют тип double. | |
2. | В подпрограмме am14c_c пapaмeтpы a и b имeют тип complex. |
int main(void) { /* Initialized data */ static float a[20] /* was [5][4] */ = { 1.f,3.f,0.f,-1.f,1.f,3.f,3.f, -2.f,0.f,1.f,1.f,-5.f,1.f,1.f,1.f,1.f,1.f,5.f,-3.f,1.f }; static float x[4] = { 1.f,-2.f,0.f,3.f }; /* Local variables */ extern int am14r_c(float *, int *, int *, float *), afp4r_c(float *, int *, int *, float *, float *); static float d1[5], d2[4]; static int i__; for (i__ = 0; i__ <= 15; i__+=3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1], a[i__+2]); } printf("\n %16.7e %16.7e \n", a[18], a[19]); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e \n", x[i__-1]); } afp4r_c(a, &c__5, &c__4, d1, d2); for (i__ = 0; i__ <= 15; i__+=3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1], a[i__+2]); } printf("\n %16.7e %16.7e \n", a[18], a[19]); am14r_c(a, &c__5, &c__4, x); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e \n", x[i__-1]); } return 0; } /* main */ Результат: x = ( 1.00000, - 0.51676, - 1.62275, 3.17799 )