Вычисление сингулярных чисел прямоугольной матрицы.
Подпрограмма PDGESVD4 вычисляет сингулярные числа вещественной прямоугольной матрицы A
Матрица A приводится к двухдиагональной форме A = U1 B V1T, где U1 и V1 являются ортогональными матрицами, а B является вещественной и верхней двухдиагональной.
Сингулярные числа матрицы A совпадают с сингулярными числами матрицы B.
Сингулярные числа матрицы B вычисляются с помощью qd - алгоритма и помещаются в одномерном массиве двойной точности в убывающем порядке.
Матрица A должна быть задана в виде двумерного массива двойной точности. Все вычисления проводятся в режиме DOUBLE PRECISION.
Литература:
Fernando K.V. and Parlett B.N. Accurate singular values and differential
qd algorithms// Numer.Math. 1994, Vol-67, No. 2, pp. 191-230.
Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических
вычислений. М.: Изд-во МИР, 1980.
http://www.netlib.org/scalapack/slug/index.html
CALL PDGESVD4 ( M, N, A, IA, JA, DESCA, S, WORK, LWORK, INFO)
Параметры
M - | число строк входной матрицы A, (глобальный входной параметр, тип целый); |
N - | число столбцов входной матрицы A, (глобальный входной параметр, тип целый); |
A - |
массив двойной точности глобальной размерности (M, N),
локальной размерности (MP, NQ), распределенный
блочно - циклическим образом (см.), MP - число локальных строк в матрице A; NQ - число локальных столбцов в матрице A; на выходе содержимое A не сохраняется (локальный входной параметр, локальное рабочее пространство); |
IA - | номер строки в глобальном массиве A, указывающий на первую строку подматрицы sub (A) (глобальный входной параметр, тип целый); |
JA - | номер столбца в глобальном массиве A, указывающий на первый столбец подматрицы sub (A) (глобальный входной параметр, тип целый); |
DESCA - | дескриптор распределенной матрицы A (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый); |
S - | одномерный массив двойной точности длины SIZE = min (M, N); содержит сингулярные числа матрицы A, расположенные по убыванию, т.е. S ( i ) і S ( i + 1); (глобальный выходной параметр); |
WORK - |
одномерный рабочий массив двойной точности длины LWORK; на выходе (если INFO = 0) WORK (1) содержит минимальную требуемую величину LWORK (локальное рабочее пространство, локальный выходной параметр); |
LWORK - |
размер рабочего пространства (массива) WORK; минимальная требуемая величина LWORK может быть вычислена самой подпрограммой, если к ней обратиться со значением LWORK = - 1; при этом подпрограмма не производит никаких других вычислений, а требуемое значение LWORK возвращается в элементе массива WORK (1); при этом, сообщений об ошибках не выдается (локальный входной параметр); |
INFO - | целая переменная, диагностирующая результат работы подпрограммы (глобальный выходной параметр): |
= 0 - | успешное завершение работы; |
< 0 - |
если i - й фактический параметр является массивом и
его j - й элемент имеет недопустимое значение, то
INFO = - ( i * 100 + j ), если i - й фактический параметр является скаляром и имеет недопустимое значение, то INFO = - i; |
> 0 - |
если подпрограмма DBDSQR не обеспечивает сходимость; если INFO = MIN(M, N)+1, то в этом случае PDGESVD4 не гарантирует точность полученных результатов. |
Версии
PSGESVD4 - | вычисление сингулярных чисел прямоугольной матрицы A для вещественных данных одинарной точности |
Вызываемые подпрограммы
Здесь указаны только базовые подпрограммы (второго уровня), которые вызываются из целевой подпрограммы (первого уровня).
PDGEBRD - | приведение прямоугольной матрицы общего вида к вещественному двухдиагональному виду при помощи ортогональных преобразований; |
PDLARED1D - | перераспределяет одномерный массив, предполагая, что входной массив BYCOL является распределенным по строкам, и что все столбцы решетки процессов содержат ту же самую копию BYCOL; выходной массив BYALL будет идентичным на всех процессах и содержать весь массив; |
PDLARED2D - | перераспределяет одномерный массив в предположении, что входной массив BYROW является распределенным по столбцам, и что все строки решетки процессов содержат ту же самую копию BYROW; выходной массив BYALL будет идентичным на всех процессах и содержать весь массив; |
PDLAMCH - | вычисление машинных параметров для арифметики с плавающей запятой с удвоенной точностью; |
PDLASCL - | умножение вещественной матрицы на вещественный скаляр |
DBDSQR - | сингулярное разложение вещественной квадратной двухдиагональной (верхней или нижней) матрицы с использованием QR - алгоритма и вращения Ривеиса |
Замечания по использованию
В подпрограмме PSGESVD4 параметры A, S имеют тип REAL. |
Используются подпрограммы BLACS_GRIDINFO (из пакета BLACS), LSAME (из пакета BLAS), PXERBA (из пакета PBLAS), CHK1MAT, PCHK1MAT, NUMROC ( из библиотеки ScaLAPACK_TOOLS); PDLACPY (из пакета ScaLAPACK). |
Вычисление всех сингулярных чисел матрицы A, которая имеет вид
| 1 6 11 | | 2 7 12 | | 3 8 13 | | 4 9 14 | | 5 10 15 |
Размерность матрицы M = 5, N = 3.
Пусть матрица разбивается на блоки с размером блоков NB = 2.
Осуществляется пропуск программы на 4 процессах, которые образуют решетку 2 на 2.
Фрагмент фортранного текста вызывающей программы.
(Полный текст теста можно получить в tdgesvd4.zip,
а принятые обозначения - посмотреть в разделе документации
"Обозначения и упрощения в примерах
по использованию подпрограмм комплекса").
Матрица A инициализируется посредством обращения к подпрограмме PDELSET из библиотеки ScaLAPACK_TOOLS.
PROGRAM TDGESVD4 include 'mpif.h' * INTEGER LWORK, MAXN, LDA, MAXPROCS, NOUT PARAMETER ( LDA = 100, LWORK = 46, MAXN = 100, * PARAMETER ( LDA = 100, LWORK = -1, MAXN = 100, $ MAXPROCS = 512, NOUT =6 ) * INTEGER CTXT, I, IAM, INFO, MYCOL, MYROW, M, N, NB, $ NPCOL, NPROCS, NPROW, IA, JA * INTEGER DESCA( 9 ) DOUBLE PRECISION A( LDA, LDA ), S( 3 ), $ WORK( LWORK ), WORK1( 5 ) * $ WORK( 46 ), WORK1( 5 ) * EXTERNAL BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT, $ BLACS_GRIDINFO, BLACS_GRIDINIT, BLACS_PINFO, $ BLACS_SETUP, DESCINIT, PDMATINIT, PDLAPRNT, PDGESVD4 * N = 3 M = 5 NB = 2 NPROW = 2 NPCOL = 2 IA = 1 JA = 1 * CALL BLACS_PINFO( IAM, NPROCS ) IF( ( NPROCS .LT. 1 ) ) THEN CALL BLACS_SETUP( IAM, NPROW*NPCOL ) END IF * CALL BLACS_GET( -1, 0, CTXT ) CALL BLACS_GRIDINIT( CTXT, 'R', NPROW, NPCOL ) CALL BLACS_GRIDINFO( CTXT, NPROW, NPCOL, MYROW, MYCOL ) * IF( MYROW .EQ. -1 ) GO TO 20 * CALL DESCINIT( DESCA, M, N, NB, NB, 0, 0, CTXT, LDA, INFO ) * * Построение матрицы A * CALL PDMATINIT( M, N, A, IA, JA, DESCA, INFO ) * * Вычисление всех сингулярных чисел матрицы A * CALL PDGESVD4( M, N, A, IA, JA, DESCA, S, WORK, LWORK, INFO ) * CALL BLACS_GRIDEXIT( CTXT ) 20 CONTINUE CALL BLACS_EXIT( 0 ) STOP END * SUBROUTINE PDMATINIT( M, N, A, IA, JA, DESCA, INFO ) * * PDMATINIT генерирует и распределяет матрицу A по решетке процессов * * Параметры INTEGER IA, INFO, JA, M, N INTEGER DESCA( * ) DOUBLE PRECISION A( * ) * Локальные переменные INTEGER I, J DOUBLE PRECISION AIJ * EXTERNAL PDELSET INTRINSIC DBLE * INFO = 0 IF( IA.NE.1 ) THEN INFO = -3 ELSE IF( JA.NE.1 ) THEN INFO = -4 END IF * DO 2 J = 1, N DO 1 I = 1, M AIJ = DBLE(I + (J-1)*M) CALL PDELSET( A, I, J, DESCA, AIJ) 1 CONTINUE 2 CONTINUE RETURN END Результаты: Значение INFO = 0 Сингулярные числа: S( 1 ) = 35.12722; S( 2 ) = 2.46539; S( 3 ) = 3.1655 E-015;