Текст подпрограммы и версий
afp9r_c.zip , afp9d_c.zip , afp9c_c.zip
Тексты тестовых примеров
tafp9r_c.zip , tafp9d_c.zip , tafp9c_c.zip

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

Назначение

Приведение прямоугольной матрицы A размера n*m (n ≤ m) к нижнему треугольному виду преобразованиями вращения.

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

Для прямоугольной матрицы A paзмeра N*М (N ≤ М) строится последовательность матриц вращения T1 2,T1 3, ..., TN M paзмера M*M такая, что

     AT1 2 ... TN M  = L , 

где L - нижняя треугольная матрица размера N*М. В результате нижняя треугольная матрица L запоминается на месте соответствующих элементов матрицы А.

Матрицы Ti j,   i = 1, ..., N,   j = 2, ..., М,   i < j,  являющиеся матрицами плоского вращения в плоскости ( i, j ), у которых элементы Ti i = Tj j = C, Ti j = - S, Tj i = S, а остальные элементы главной диагонали равны 1, свертываются в число t = S / (1 + С), по которому они восстанавливаются с помощью формул

       C = (1 - | t |2) / (1 + | t |2) ,     S = 2t / (1 + | t |2) , 

и упаковываются над нижней треугольной частью матрицы А : информация о матрице Ti j запоминается на месте элемента с индексами ( i, j ).

В.В.Воеводин, Вычислительные основы линейной алгебры, М., Наука, 1977.

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

    int afp9r_c (real *a, integer *n, integer *m)

Параметры

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

Версии

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

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

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

  1. 

В случае надобности преобразования вектора матрицами вращения Tn m,...,T1 2, упакованными в матрице A описанным выше способом, можно воспользоваться подпрограммой am10r_c.

  2. 

В подпрограмме afp9d_c параметр a имеет тип double.

  3.  В подпрограмме afp9c_c параметр a имеет тип complex.

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

int main(void)
{
    /* Initialized data */
    static float a[15] /* was [3][5] */ = { .6f,.4f,2.6f,0.f,0.f,0.f,0.f,0.f,
                                       .6f,-.8f,-2.2f,-6.8f,0.f,0.f,-.8f };
    /* Local variables */
    extern int afp9r_c(float *, int *, int *);
    static int i__;

#define a_ref(a_1,a_2) a[(a_2)*3 + a_1 - 4]

    afp9r_c(a, &c__3, &c__5);

    for (i__ = 1; i__ <= 3; ++i__) {
        printf("\n %15.7e %15.7e %15.7e \n %15.7e %15.7e \n",
            a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3),
            a_ref(i__, 4), a_ref(i__, 5));
    }
    return 0;
} /* main */


Результат:

                      | 1   0   0   -0.5  0    |
      a_ref  =    | 2  -1   0    1     0    |
                      | 7  -2   1    0    -0.5 |

Это означает, что

                 | 1   0   0   0   0 |
      l  =    | 2  -1   0   0   0 |
                 | 7  -2   1   0   0 |