Текст подпрограммы и версий am18r_c.zip , am18d_c.zip , am18c_c.zip |
Тексты тестовых примеров tam18r_c.zip , tam18d_c.zip , tam18c_c.zip |
Преобразование вектора последовательностью матриц отражения, упакованных над главной диагональю (включительно) прямоугольной матрицы размера N на M (N ≤ M).
Подпрограмма am18r_c вычисляет произведение
Q1 Q2 ... QN В ,
где Q1, Q2,..., QN - матрицы отражения размера M * N, B - заданный вектоp длины M. Матpицы отpажения Qi имеют вид
Qi = Е - Wi WiН ,
где Е - единичная матрица размера M * M,
Wi - вектор
длины M, первые i - 1 компонент
которого равны нулю.
Ненулевые компоненты векторов Wi, порождающих
матрицы Qi, задаются
в строках над главной диагональю (включительно)
прямоугольной матрицы A размера N * М
(N ≤ М), т.е.
Wi = ( 0, 0, ... , 0, ai i, ai i+1, ... , ai M )H .
Данная упаковка последовательности матриц отражения получается, например, в результате работы подпрограмм, реализующих приведение прямоугольной матрицы А размера N * М (N ≤ М) к нижнему треугольному виду (afp3r_c) или к нижнему двухдиагональному виду (afp5r_c) методом отражений.
int am18r_c (real *a, integer *n, integer *m, real *b)
Параметры
a - | вещественный двумерный массив размера n * m, в котором в упакованном виде хранится информация о матрицах отражения; |
n, m - | число строк и столбцов матрицы A соответственно, n ≤ m (тип: целый); |
b - | вещественный одномерный массив длины m, в котором задается исходный вектор B; в результате работы подпрограммы на месте b запоминается преобразованный вектор Q1 Q2 ... Qn B. |
Версии
am18d_c - | преобразование вектора последовательностью матриц отражения, упакованных над главной диагональю (включительно) прямоугольной матрицы размера N * M (N ≤ M), с повышенной точностью. |
am18c_c - | преобразование комплексного вектора последовательностью комплексных матриц отражения, упакованных над главной диагональю (включительно) прямоугольной матрицы размера N * M (N ≤ M). |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
В подпрограмме am18d_c пapaмeтpы a и b имeют тип double. | |
2. | В подпрограмме am18c_c пapaмeтpы a и b имeют тип complex. |
int main(void) { /* Initialized data */ static float a[30] /* was [5][6] */ = { 1.f,3.f,0.f,1.f,3.f,3.f,-2.f,0.f, 1.f,5.f,2.f,0.f,1.f,1.f,1.f,1.f,1.f,2.f,0.f,1.f,-1.f,1.f,1.f,2.f, 0.f,0.f,1.f,1.f,3.f,2.f }; static float x[6] = { 1.f,0.f,2.f,-1.f,1.f,0.f }; /* Local variables */ extern int am18r_c(float *, int *, int *, float *), afp3r_c(float *, int *, int *, float *, int *); static float t[6]; static int is[5], i__; for (i__ = 0; i__ <= 27; i__+= 3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1] , a[i__+2]); } for (i__ = 1; i__ <= 6; ++i__) { printf("\n %16.7e \n", x[i__-1]); } afp3r_c(a, &c__5, &c__6, t, is); for (i__ = 0; i__ <= 27; i__+= 3) { printf("\n %16.7e %16.7e %16.7e \n", a[i__], a[i__+1] , a[i__+2]); } am18r_c(a, &c__5, &c__6, x); for (i__ = 1; i__ <= 6; ++i__) { printf("\n %16.7e \n", x[i__-1]); } return 0; } /* main */ Результат: x = ( 0.04233, - 0.869395, 0.62655, 0.92835, - 1.28063, - 1.82974 )