Текст подпрограммы и версий
afp2r_c.zip , afp2d_c.zip , afp2c_c.zip
Тексты тестовых примеров
tafp2r_c.zip , tafp2d_c.zip , tafp2c_c.zip

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

Назначение

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

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

Выполняется факторизация мaтpицы А вида АР = QR, где Q - унитарная матрица, R - верхняя треугольная матрица, Р - матрица перестановок. maтpица Р осуществляет перестановку столбцов А и обеспечивает выпoлнeние нормализованного процесса. Матрицa Q строится как произведение матриц Q1T, Q2T, ..., QMT, где Q1, Q2, ..., QM - преобразования отражения, приводящие матрицу АР к верхнему треугольному виду:

     QMQM-1 ... Q1AP = R 

В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, комплекс алгоритмов, основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.

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

    int afp2r_c (real *a, integer *n, integer *m, real *w,
            integer *s)

Параметры

a - двумерный n*m массив, в котором задается исходная матрица (тип: real); в результате работы подпрограммы в массиве a на соответствующих местах запоминаются наддиагональные элементы матрицы R, в остальной части массива в последовательных столбцах запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., Qm ;
n, m - заданные размеры исходной матрицы, причем n ≥ m (тип: целый);
w - одномерный массив длины n, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых m компонентах w запоминаются диагональные элементы матрицы R;
s - одномерный массив длины m, в котором запоминается вектор, порождающий матрицу перестановок (тип: целый); в s (k) запоминается номер столбца, переставленного с K - ым столбцом текущей матрицы на K - ом шаге преобразования.

Версии

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

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

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

  1. 

В подпрограмме afp2c_c массивы a, w имеют тип complex.

  2.  В подпрограмме afp2d_c массивы a, w имеют тип double.

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

int main(void)
{
    /* Initialized data */
    static float a[28] /* was [7][4] */ = { 1.f,0.f,2.f,1.f,-1.f,-1.f,0.f,
               3.f,2.f,1.f,-3.f,1.f,1.f,2.f,2.f,2.f,-1.f,-4.f,2.f,2.f,2.f,4.f,
               3.f,-2.f,0.f,0.f,2.f,0.f };
    /* Local variables */
    extern int afp2r_c(float *, int *, int *, float *, int *);
    static int i__, l[4];
    static float v[7];

#define a_ref(a_1,a_2) a[(a_2)*7 + a_1 - 8]

    for (i__ = 1; i__ <= 7; ++i__) {
        printf("\n %12.4e %12.4e %12.4e %12.4e \n",
              a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4));
    }
    afp2r_c(a, &c__7, &c__4, v, l);

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


Результат:

                      |  1.153  -3.288   1.315  -4.768 |
                      |  0.285   1.120  -0.493  -0.493 |
                      | -0.143  -0.208   1.357  -2.455 |
      a_ref  =    | -0.570   0.684   0.149    1.334 |
                      |  0.285  -0.342  -0.224  -1.350 |
                      |  0.285   0.037  -0.282  -0.425 |
                      |  0.285  -0.342   0.076  -1.423 |

      (v(i), i = 1, 4)  =  -6.083,  -4.711,  -2.455,  7.797*10- 12 , 

      l  =   (3,  4,  3,  4) .

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

                 | -6.083  -3.288    1.315  -4.768           |
                 |  0.         -4.711  -0.493  -0.493           |
                 |  0.          0.         -2.455  -2.455           |
      r  =    |  0.          0.           0.         7.797*10-12 |   , 
                 |  0.          0.           0.         0.                 |
                 |  0.          0.           0.         0.                 |
                 |  0.          0.           0.         0.                 |

      qi  =  i - wi * wit ,   i = 1, 2, 3, 4 ,
 где
      w1t =  (1.153, 0.285, -0.143, -0.570, 0.285, 0.285, 0.285) ,

      w2t =  (0., 1.120, -0.208, 0.684, -0.342, 0.037, -0.342) ,

      w3t =  (0., 0., 1.357, 0.149, -0.224, -0.282, 0.076) ,

      w4t =  (0., 0., 0., -1.084, 0.430, 0.538, 0.592) .