Текст подпрограммы и версий afp3r_c.zip , afp3c_c.zip , afp3d_c.zip |
Тексты тестовых примеров tafp3r_c.zip , tafp3c_c.zip , tafp3d_c.zip |
LQ - разложение вещественной прямоугольной матрицы размера n*m (n ≤ m) нормализованным процессом метода отражений.
Выполняется факторизация матрицы А вида РА = LQ, где Q - унитарная матрица, L - нижняя треугольная матрица, Р - матрица перестановок. Матрица Р осуществляет перестановку строк матрицы А и обеспечивает выполнение нормализованного процесса. Матрица Q строится как произведение матриц QNT, ..., Q2T, Q1T, где Q1, Q2, ... QN - преобразования отражения, приводящие матрицу РА к нижнему треугольному виду:
paq1Q2 ... QN = L .
В.В.Воеводин, Л.И.Карышева, Г.Д.Ким, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях отражения, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд. МГУ, 1973.
int afp3r_c (real *a, integer *n, integer *m, real *w, integer *s)
Параметры
a - | двумерный n*m массив, в котором задается исходная матрица (тип: real); в результате работы подпрограммы в массиве a на соответствующих местах запоминаются поддиагональные элементы матрицы L, в остальной части массива в последовательных строках запоминаются векторы, порождающие матрицы отражения Q1, Q2, ..., Qn ; |
n, m - | заданные размеры исходной матрицы, причем n ≤ m (тип: целый); |
w - | одномерный массив длины m, используемый подпрограммой как рабочий (тип: real); в результате работы подпрограммы в первых n компонентах w запоминаются диагональные элементы матрицы l; |
s - | одномерный массив длины n, в котором запоминается вектор, порождающий матрицу перестановок (тип: целый); в s (k) запоминается номер строки, переставленной с K - ой строкой текущей матрицы на K - ом шаге преобразования. |
Версии
afp3c_c - | LQ - разложение нормализованным процессом метода отражений для прямоугольной n*m (n ≤ m) комплексной матрицы; |
afp3d_c - | LQ - разложение нормализованным процессом метода отражений для прямоугольной n*m (n ≤ m) вещественной матрицы, заданной с удвоенной точностью. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме afp3c_c массивы a, w имеют тип complex. | |
2. | В подпрограмме afp3d_c массивы a, w имеют тип double. |
int main(void) { /* Initialized data */ static float a[15] /* was [3][5] */ = { 1.f,0.f,1.f,2.f,1.f,3.f,0.f,1.f, 1.f,1.f,2.f,0.f,-1.f,1.f,0.f }; /* Local variables */ extern int afp3r_c(float *, int *, int *, float *, int *); static int i__, l[3]; static float v[5]; for (i__ = 0; i__ <=12; i__+=3) { printf("\n %12.4e %12.4e %12.4e \n", a[i__], a[i__+1], a[i__+2]); } afp3r_c(a, &c__3, &c__5, v, l); for (i__ = 0; i__ <=12; 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 %16.7e \n", v[0], v[1], v[2]); printf("\n %5i %5i %5i \n", l[0], l[1], l[2]); return 0; } /* main */ Результат: | 1.141 0.793 0.264 0.000 0.000 | a = | -1.206 1.034 0.296 0.822 0.411 | , | -2.111 -0.193 -1.209 0.509 -0.529 | ( (v(i), i = 1, 3) = -3.317, -2.355, 1.584) , l = (3, 2, 3) . Это означает, что | -3.317 0. 0. 0. 0. | r = | -1.206 -2.355 0. 0. 0. | , | -2.111 -0.193 1.584 0. 0. | qi = i - wi * wit , i = 1, 2, 3 , где w1t = (1.141, 0.793, 0.264, 0., 0.) , w2t = (0., 1.034, 0.296, 0.822, 0.411) , w3t = (0., 0., -1.209, 0.509, -0.529) .