Текст подпрограммы и версий
am18r_c.zip , am18d_c.zip , am18c_c.zip
Тексты тестовых примеров
tam18r_c.zip , tam18d_c.zip , tam18c_c.zip

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

Назначение

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