Текст подпрограммы и версий am17r_c.zip , am17d_c.zip , am17c_c.zip |
Тексты тестовых примеров tam17r_c.zip , tam17d_c.zip , tam17c_c.zip |
Преобразование вектора последовательностью матриц отражения, упакованных под главной диагональю (включительно) прямоугольной матрицы размера N на M (N ≥ M).
Подпрограмма am17r_c вычисляет произведение
QМ QМ-1 ... Q1В ,
где Q1, Q2,..., QМ - матрицы отражения размера N * N, B - заданный вектоp длины N. Матpицы отpажения Qi имеют вид
Qi = Е - Wi WiН ,
где Е - единичная матрица размера N * N,
Wi - вектор длины N, первые
i - 1 компонент которого равны нулю.
Ненулевые компоненты векторов
Wi, порождающих матрицы
Qi, задаются в столбцах под главной
диагональю (включительно) прямоугольной матрицы размера N * М
(N ≥ М), т.е.
Wi = ( 0, 0, ... , 0, ai i, ai+1 i, ... , aN i )T .
Данная упаковка последовательности матриц отражения получается, например, в результате работы подпрограмм, реализующих приведение прямоугольной матрицы А размера N * М (N ≥ М) к верхнему треугольному виду (afp2r_c) или к верхнему двухдиагональному виду (afp4r_c) методом отражений.
int am17r_c (real *a, integer *n, integer *m, real *b)
Параметры
a - | вещественный двумерный массив размера n * m, в столбцах которого в упакованном виде хранится информация о матрицах отражения; |
n, m - | число строк и столбцов матрицы A соответственно, n ≥ m (тип: целый); |
b - | вещественный одномерный массив длины n, в котором задается исходный вектор; в результате работы подпрограммы в массиве b запоминается преобразованный вектор Qm ... Q2 Q1 B. |
Версии
am17d_c - | преобразование вектора последовательностью матриц отражения, упакованных под главной диагональю (включительно) прямоугольной матрицы размера N на M (N ≥ M), с повышенной точностью. |
am17c_c - | преобразование комплексного вектора последовательностью комплексных матриц отражения, упакованных под главной диагональю (включительно) прямоугольной матрицы размера N на M (N ≥ M). |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
В подпрограмме am17d_c пapaмeтpы a и b имeют тип double. | |
2. | В подпрограмме am17c_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 b[5] = { 1.f,-2.f,0.f,3.f,-1.f }; /* Local variables */ extern int am17r_c(float *, int *, int *, float *), afp2r_c(float *, int *, int *, float *, int *); static int i__, s[4]; static float t[5]; #define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6] for (i__ = 1; i__ <= 5; ++i__) { printf("\n %12.0f %12.0f \n", a_ref(i__, 1), a_ref(i__, 2)); printf("\n %12.0f %12.0f \n", a_ref(i__, 3), a_ref(i__, 4)); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %12.0f \n", b[i__-1]); } afp2r_c(a, &c__5, &c__4, t, s); am17r_c(a, &c__5, &c__4, b); for (i__ = 1; i__ <= 5; ++i__) { printf("\n %16.7e %16.7e \n", a_ref(i__, 1), a_ref(i__, 2)); printf("\n %16.7e %16.7e \n", a_ref(i__, 3), a_ref(i__, 4)); } for (i__ = 1; i__ <= 5; ++i__) { printf("\n %16.7e \n", b[i__-1]); } return 0; } /* main */ Результат: b = ( 1.80839, 2.35993, 0.20543, - 1.43105, 2.01751 )