Текст подпрограммы и версий
am15r_c.zip , am15d_c.zip , am15c_c.zip
Тексты тестовых примеров
tam15r_c.zip , tam15d_c.zip , tam15c_c.zip

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

Назначение

Преобразование вектора последовательностью матриц отражения, упакованных под главной диагональю прямоугольной матрицы размера N * M (N ≤ M).

Математическое описание

Подпрограмма am15r_c вычисляет произведение

           QN-1 QN-2 ... Q1В  , 

где  Q1, Q2,...,QN - 1 - матрицы отражения размера N * N,  B - заданный вектор длины  N. Матрицы отражения  Qi  имеют вид

           Qi  =  Е - Wi WiН  , 

где  Е - единичная матрица размера N * N,  Wi - вектор длины  N, первые  i  компонент которого равны нулю.
Ненулевые компоненты векторов  Wi,  порождающих матрицы  Qi,  задаются в столбцах под главной диагональю прямоугольной матрицы  А размера N * М (N ≤ М), т.е.

           Wi  =  ( 0, 0, ... , 0, ai+1 i, ai+2 i, ... , aN i )T  . 

Данная упаковка последовательности матриц отражения получается, например, в результате работы подпрограммы, реализующей приведение прямоугольной матрицы  А размера N * М (N ≤ М) к нижнему двухдиагональному виду (afp5r_c) методом отражений.

Использование

    int am15r_c (real *a, integer *n, integer *m, real *b)

Параметры

a - вещественный двумерный массив размера n * m, в котором в упакованном виде хранится информация о матрицах отражения;
n, m - соответственно число строк и столбцов матрицы  A; n ≤ m (тип: целый);
b - вещественный одномерный массив длины  n, в котором задается исходный вектор  B; в результате работы подпрограммы на месте  b запоминается преобразованный вектор Qn - 1 Qn - 2 ... Q1 B.

Версии

am15d_c - преобразование вектора последовательностью матриц отражения, упакованных под главной диагональю прямоугольной матрицы размера N * M (N ≤ M), с повышенной точностью.
am15c_c - преобразование комплексного вектора последовательностью комплексных матриц отражения, упакованных под главной диагональю прямоугольной матрицы размера N * M (N ≤ M).

Вызываемые подпрограммы: нет.

Замечания по использованию

  1. 

В подпрограмме am15d_c пapaмeтpы  a и  b имeют тип double.

  2.  В подпрограмме am15c_c пapaмeтpы  a и  b имeют тип complex.

Пример использования

int main(void)
{
    /* Initialized data */
    static float a[20] /* was [4][5] */ = { 1.f,3.f,0.f,-1.f,3.f,3.f,-2.f,
                   0.f,1.f,-5.f,1.f,1.f,1.f,1.f,5.f,-3.f,-2.f,1.f,0.f,4.f };
    static float b[4] = { 1.f,-2.f,0.f,3.f };

    /* Local variables */
    extern int am15r_c(float *, int *, int *, float *),
               afp5r_c(float *, int *, int *, float *, float *);
    static float d1[5], d2[4];
    static int i__;

    for (i__ = 0; i__ <= 18; i__+= 2) {
         printf("\n  %16.7e %16.7e \n", a[i__], a[i__+1]);
    }
    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n  %16.7e \n", b[i__-1]);
    }

    afp5r_c(a, &c__4, &c__5, d1, d2);

    for (i__ = 0; i__ <= 18; i__+= 2) {
         printf("\n  %16.7e %16.7e \n", a[i__], a[i__+1]);
    }
    am15r_c(a, &c__4, &c__5, b);

    for (i__ = 1; i__ <= 4; ++i__) {
         printf("\n  %16.7e \n", b[i__-1]);
    }
    return 0;
} /* main */


Результат:    b  =  ( 1.00000, 3.59139, 0.24574, - 0.20377 )