Текст подпрограммы и версий afp2r_c.zip , afp2d_c.zip , afp2c_c.zip |
Тексты тестовых примеров tafp2r_c.zip , tafp2d_c.zip , tafp2c_c.zip |
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) .