Сингулярное разложение вещественной прямоугольной матрицы с вычислением сингулярных чисел и левых и/или правых сингулярных векторов.
Подпрограмма PDGESVD6 выполняет сингулярное разложение (SVD - singular value decomposition) матрицы A размера M на N в виде
A = U * D * VT ,
где
D - прямоугольная матрица размера M на N, у которой
все элементы, кроме диагональных dk k, k = 1, 2, ..., min(M,N), равны нулю;
U, V - ортогональные матрицы порядка M и N соответственно.
Вычисляются левые и/или правые сингулярные векторы.
Диагональные элементы матрицы D являются сингулярными числами матрицы A, а столбцы матриц U и V являются соответствующими правыми и левыми сингулярными векторами соответственно.
Сингулярные числа помещаются в одномерном массиве двойной точности в
убывающем порядке и вычисляются только первые min (M, N) столбцов матрицы
U и/или строк матрицы VT = VT.
Матрицы A, U и VT должны быть заданы в виде двумерных массивов двойной точности.
Все вычисления проводятся в режиме DOUBLE PRECISION.
Литература:
Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических
вычислений. М.: Изд-во МИР, 1980.
http://www.netlib.org/scalapack/slug/index.html
CALL PDGESVD6 ( SV, M, N, A, IA, JA, DESCA, S,
U, IU, JU, DESCU, VT, IVT, JVT, DESCVT,
WORK, LWORK, INFO)
Параметры
| SV - |
если SV = 'R' - требуется вычислить только правые
сингулярные векторы матрицы A; если SV = 'L' - требуется вычислить только левые сингулярные векторы матрицы A; если SV = 'A' - требуется вычислить и левые и правые сингулярные векторы матрицы A; (глобальный входной параметр, тип символьный); |
| M - | число строк исходной матрицы A, (глобальный входной параметр, тип целый); |
| N - | число столбцов исходной матрицы A, (глобальный входной параметр, тип целый); |
| A - |
массив двойной точности глобальной размерности (M, N),
локальной размерности (MP, NQ), распределенный блочно - циклическим
образом (см.), MP - число локальных строк в матрицах A и U; NQ - число локальных столбцов в матрицах A и VT; на выходе содержимое A не сохраняется (локальный входной параметр, локальное рабочее пространство); |
| IA - | номер строки в глобальном массиве A, указывающий на первую строку подматрицы sub (A) (глобальный входной параметр, тип целый); |
| JA - | номер столбца в глобальном массиве A, указывающий на первый столбец подматрицы sub (A) (глобальный входной параметр, тип целый); |
| DESCA - | дескриптор распределенной матрицы A (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый); |
| S - | одномерный массив двойной точности длины SIZE = min (M, N); содержит сингулярные числа матрицы A, расположенные по убыванию т.е. S ( i ) і S ( i + 1); (глобальный выходной параметр); |
| U - |
массив двойной точности глобальной размерности (M, SIZE),
локальной размерности (MP, SIZEQ); SIZEQ - число локальных столбцов в массиве U; MP - число локальных строк в массивах A и U; на выходе: если SV = 'R' или 'A', то в первых min (M, N) столбцах U содержатся правые сингулярные векторы; если SV = 'L', то U не используется (локальный выходной параметр); |
| IU - | номер строки в глобальном массиве U, указывающий на первую строку подматрицы sub (U) (глобальный входной параметр, тип целый); |
| JU - | номер столбца в глобальном массиве U, указывающий на первый столбец подматрицы sub (U) (глобальный входной параметр, тип целый); |
| DESCU - | дескриптор распределенной матрицы U (одномерный массив длины DLEN_); подробное описание см.в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый); |
| VT - |
массив двойной точности глобальной размерности (SIZE, N),
локальной размерности (SIZEP, NQ); SIZEP - число локальных строк в массиве VT; NQ - число локальных столбцов в массивах A и VT; на выходе: если SV = 'L' или 'A', то в первых SIZE строках VT содержатся левые сингулярные векторы; если SV = 'R', то VT не используется (локальный выходной параметр); |
| IVT - | номер строки в глобальном массиве VT, указывающий на первую строку подматрицы sub (VT) (глобальный входной параметр, тип целый); |
| JVT - | номер столбца в глобальном массиве VT, указывающий на первый столбец подматрицы sub (VT) (глобальный входной параметр, тип целый); |
| DESCVT - | дескриптор распределенной матрицы VT (одномерный массив длины DLEN_); подробное описание см. в разделе документации "Дескрипторы глобальных массивов" (глобальный и локальный входной параметр, тип целый); |
| 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, то в этом случае PDGESVD6 не гарантирует точность полученных результатов. |
Версии
| PSGESVD6 - | сингулярное разложение вещественной прямоугольной матрицы с вычислением сингулярных чисел и левых и/или правых сингулярных векторов для вещественных данных одинарной точности |
Вызываемые подпрограммы
Здесь указаны только базовые подпрограммы (второго уровня), которые вызываются из целевой подпрограммы (первого уровня).
| PDGEBRD - | приведение прямоугольной матрицы общего вида к вещественному двухдиагональному виду при помощи ортогональных преобразований; |
| PDGEMR2D - | перераспределение элементов матриц по процессам блочно-циклическим образом; |
| PDORMBR - | умножение матрицы общего вида на ортогональную матрицу преобразований, полученную при приведении матрицы A к двухдиагональному виду подпрограммой PDGEBRD; |
| PDLARED1D - | перераспределяет одномерный массив, предполагая, что входной массив BYCOL является распределенным по строкам, и что все столбцы решетки процессов содержат ту же самую копию BYCOL; выходной массив BYALL будет идентичным на всех процессах и содержать весь массив; |
| PDLARED2D - | перераспределяет одномерный массив в предположении, что входной массив BYROW является распределенным по столбцам и что все строки решетки процессов содержат ту же самую копию BYROW; выходной массив BYALL будет идентичным на всех процессах и содержать весь массив; |
| PDLAMCH - | вычисление машинных параметров для арифметики с плавающей запятой с удвоенной точностью; |
| PDLASET - | присвоение всем внедиагональным элементам матрицы вещественного значения двойной точности равного a, а всем диагональным элементам - вещественного значения двойной точности равного b; |
| PDLASCL - | умножение вещественной матрицы на вещественный скаляр; |
| DBDSQR - | сингулярное разложение вещественной квадратной двухдиагональной (верхней или нижней) матрицы с использованием QR - алгоритма и вращения Ривеиса; |
Замечания по использованию
| В подпрограмме PSGESVD6 параметры A, U, VT, S имеют тип REAL. |
|
Используются подпрограммы: BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO,
BLACS_GRIDINIT (из пакета BLACS), LSAME (из пакета BLAS), PXERBA (из пакета PBLAS), ICEIL, 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.
Фрагмент фортранного текста вызывающей программы.
(Полный текст теста можно получить в tdgesvd6.zip,
а принятые обозначения - посмотреть в разделе документации
"Обозначения и упрощения в примерах
по использованию подпрограмм комплекса").
Матрица A инициализируется посредством обращения к подпрограмме PDELSET из библиотеки ScaLAPACK_TOOLS.
PROGRAM TDGESVD6
include 'mpif.h'
*
INTEGER LWORK, MAXN, LDA, MAXPROCS, NOUT
PARAMETER ( LDA = 100, LWORK = 52, MAXN = 100,
* PARAMETER ( LDA = 100, LWORK = -1, MAXN = 100,
$ MAXPROCS = 512, NOUT =6 )
*
CHARACTER SV
INTEGER CTXT, I, IAM, INFO, MYCOL, MYROW, M, N, NB,
$ NPCOL, NPROCS, NPROW, IA, JA, JU, IU,
$ IVT, JVT, SIZE
*
INTEGER DESCA( 9 ), DESCU( 9 ), DESCVT( 9 )
DOUBLE PRECISION A( LDA, LDA ), S( 3 ), U(LDA,LDA), VT(LDA,LDA),
* U(3,2), VT(2,2),
$ WORK( LWORK ), WORK1( 5 )
* $ WORK( 52 ), WORK1( 5 )
*
EXTERNAL BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT,
$ BLACS_GRIDINFO, BLACS_GRIDINIT, BLACS_PINFO,
$ BLACS_SETUP, DESCINIT, PDMATINIT, PDLAPRNT,
$ PDGESVD6
*
N = 3
M = 5
NB = 2
NPROW = 2
NPCOL = 2
IA = 1
JA = 1
IU = 1
JU = 1
IVT = 1
JVT = 1
SIZE = MIN( M, N )
SV = 'L'
*
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 )
CALL DESCINIT( DESCU, M, SIZE, NB, NB, 0, 0, CTXT, LDA, INFO )
CALL DESCINIT( DESCVT, SIZE, N, NB, NB, 0, 0, CTXT, LDA, INFO )
*
* Построение матрицы A
*
CALL PDMATINIT( M, N, A, IA, JA, DESCA, INFO )
*
* Вычисление сингулярных чисел и векторов матрицы A
*
CALL PDGESVD6( SV, M, N, A, IA, JA, DESCA, S, U, IU, JU, DESCU,
$ VT, IVT, JVT, DESCVT, 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 ;
Левые сингулярные векторы:
Матрица VT
VT( 1, 1) = - 0.2016649D+00
VT( 2, 1) = 0.8903171D+00
VT( 3, 1) = - 0.4082483D+00
VT( 1, 2) = - 0.5168305D+00
VT( 2, 2) = 0.2573316D+00
VT( 3, 2) = 0.8164966D+00
VT( 1, 3) = - 0.8319961D+00
VT( 2, 3) = - 0.3756539D+00
VT( 3, 3) = 0.4082483D+00