Текст подпрограммы и версий
am14r_c.zip , am14d_c.zip , am14c_c.zip
Тексты тестовых примеров
tam14r_c.zip , tam14d_c.zip , tam14c_c.zip

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

Назначение

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