Текст подпрограммы и версий
am17r_c.zip , am17d_c.zip , am17c_c.zip
Тексты тестовых примеров
tam17r_c.zip , tam17d_c.zip , tam17c_c.zip

Подпрограмма:  am17r_c

Назначение

Преобразование вектора последовательностью матриц отражения, упакованных под главной диагональю (включительно) прямоугольной матрицы размера 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 )