Текст подпрограммы и версий
am10r_c.zip , am10d_c.zip , am10c_c.zip
Тексты тестовых примеров
tam10r_c.zip , tam10d_c.zip , tam10c_c.zip

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

Назначение

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

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

Вектор B длины М последовательно умножается слева на матрицы вращения  ТN М, ТN М-1, ..., Т1 2,  упакованные над главной диагональю заданной прямоугольной матрицы А размера N*М (N ≤ М) таким образом, что если  t = А(i, j), то матрица  Тi j размера M*M является матрицей плоского вращения в плоскости (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 am10r_c (real *a, integer *n, integer *m, real *b)

Параметры

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

Версии

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

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

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

  1. 

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

  2. 

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

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

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

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

    /* Local variables */
    extern int am10r_c(float *, int *, int *, float *);
    static int i__;

    am10r_c(a, &c__4, &c__5, 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  =  ( 0.2, - 0.2, 1.4, - 1.4, 1.0 )