Текст подпрограммы и версий
am08r_c.zip , am08d_c.zip , am08c_c.zip
Тексты тестовых примеров
tam08r_c.zip , tam08d_c.zip , tam08c_c.zip

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

Назначение

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

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

Вектор B длины М последовательно умножается слева на матрицы вращения  ТМ - 1 М, ТМ-2 М, ..., Т2 3,  упакованные над верхней двух диагональной частью заданной прямоугольной матрицы А размера N*М (N ≥ М) таким образом, что если  t = А(i-1, j),  i < j, то матрица  Тi j размера М*М является матрицей плоского вращения в плоскости (i, j), у которой элементы  Ti i = Tj j = С,  Ti j = -S,  Tj i = S,  а остальные элементы главной диагонали равны 1,
где  С = (1 - | t |2 ) / (1 + | t |2) ,  S = 2t / (1 + | t |2).

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

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

Параметры

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

Версии

am08d_c - левосторонние преобразования вектора последовательностью матриц вращения с повышенной точностью.
am08c_c - левосторонние преобразования комплексного вектора последовательностью комплексных матриц вращения.

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

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

  1. 

Заданная в необходимой форме последовательность матриц вращения, используемых данной подпрограммой, получается, например, в результате работы подпрограммы, реализующей приведение прямоугольной матрицы  A размера N * M (N ≥ M) к верхнему треугольному виду (afp8r_c) методом вращений.

  2. 

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

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

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

int main(void)
{
    /* Initialized data */
    static float b[5] = { 1.f,1.f,1.f,1.f,1.f };

    /* Local variables */
    extern int am08r_c(float *, int *, int *, float *);
    static float a[20] /* was [5][4] */;
    static int i__, j;

#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]

    for (i__ = 1; i__ <= 5; ++i__) {
        for (j = 1; j <= 4; ++j) {
/* L2: */
            a_ref(i__, j) = 1.f;
        }
    }
    a_ref(2, 4) = .5f;
    am08r_c(a, &c__5, &c__4, b);

    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n  %16.7e \n", b[i__-1]);
    }
    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]);
    return 0;
} /* main */


Результат:    b  =  ( 1.0, 0.2, - 1.4, 1.0, 1.0 )