Текст подпрограммы и версий
af10r_c.zip , af10d_c.zip
Тексты тестовых примеров
taf10r_c.zip , taf10d_c.zip

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

Назначение

QR - разложение вещественной прямоугольной матрицы размера m*k (m ≥ k) методом отражений, при этом ортогональная матрица Q запоминается в явном виде.

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

Выполняется факторизация мaтpицы А вида А = QR, где Q - oртогональная, R - верхняя треугольная матрица. Матрица R получается в результате умножения матрицы А на пocледовательность преобразований отражения q1, Q2, ..., QК таких, что  QКQК - 1 ... Q1А = R ,  при этом

     Q = Q1T Q2T ... QKT . 

Подпрограмма вычисляет матрицу Q в явном виде.

В.В.Воеводин. Ошибки округления и устойчивость в прямых методах линейной алгебры, Изд. МГУ, М., 1969.

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

    int af10r_c (integer *m, integer *k, real *a, real *u, real *t)

Параметры

m, k - размеры матрицы A, т.е. число строк и столбцов матрицы, соответственно (тип: целый);
a - двумерный массив, в котором задается исходная матрица; в результате работы подпрограммы в первых (k - 1) столбцах массива A запоминаются первые (k - 1) ортонормированных столбцов матрицы Q, на месте k - го столбца A запоминается k - ый столбец матрицы Q, умноженный на последний диагональный элемент треугольной матрицы R;
u - двумерный вещественный рабочий массив размера m*m; в результате работы подпрограммы в массиве u запоминается ортогональная матрица QT;
t - одномерный вещественный массив длины k * (k + 1) / 2; в результате работы подпрограммы в массиве t запоминается верхняя треугольная матрица R.

Версии

af10d_c - QR - разложение вещественной прямоугольной матрицы размера m*k, заданной с удвоенной точностью, методом отражений. При этом параметры a, u и t должны иметь тип double.

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

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

 

Подпрограмма предназначена для факторизации таких матриц A, для которых k ≤ m и ранг которых равен k.

 

Подпрограмма может применяться для ортогонализации системы линейно - независимых векторов, расписанных в виде матрицы по столбцам; ортогональная система векторов запоминается в массиве a, при этом первые (k - 1) векторов будут нормированы. Значения параметров m и k сохраняются.

  В этой подпрограмме вычисляемая в процессе разложения верхняя треугольная матрица R хранится в компактной форме в массиве t по строкам (а не по столбцам в соответствии с общим правилом).

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

int main(void)
{
    /* Initialized data */
    static float a[9] /* was [3][3] */ = { 1.f,1.f,1.f,2.f,3.f,0.f,3.f,2.f,
                                           2.f };
    /* Local variables */
    extern int af10r_c(int *, int *, float *, float *, float *);
    static int k, m, i__;
    static float t[6], u[9] /* was [3][3] */;

    m = 3;
    k = 3;
    af10r_c(&m, &k, a, u, t);

    for (i__ = 0; i__ <= 6; i__+= 3) {
        printf("\n  %15.7e %15.7e %15.7e \n",
                   a[i__], a[i__ + 1], a[i__ + 2]);
      }
    for (i__ = 0; i__ <= 6; i__+= 3) {
        printf("\n  %15.7e %15.7e %15.7e \n",
                   u[i__], u[i__ + 1], u[i__ + 2]);
      }
    for (i__ = 0; i__ <= 3; i__+= 3) {
        printf("\n  %15.7e %15.7e %15.7e \n",
                   t[i__], t[i__ + 1], t[i__ + 2]);
      }
    return 0;
} /* main */


Результаты:

        мaтpицa a

     -0.5773502692    -0.1543033500     0.6428571429
     -0.5773502692    -0.6172133998    -0.4285714286
     -0.5773502692     0.7715167498    -0.2142857143

        мaтpицa u

     -0.5773502692    -0.5773502692    -0.5773502692
     -0.1543033500    -0.6172133998     0.7715167498
      0.8017837257    -0.5345224838    -0.2672612419

        мaтpицa t

     -1.732050808     -2.886751346      -4.041451884
     -2.160246899     -0.1543033500     0.8017837257