Текст подпрограммы и версий acp1r_p.zip , acp1e_p.zip |
Тексты тестовых примеров tacp1r_p.zip , tacp1e_p.zip |
Сингулярное разложение прямоугольной матрицы размера M на N (M ≥ N).
Подпрограмма ACP1R осуществляет разложение прямоугольной матрицы A размера M на N (M ≥ N) в произведение А = UDVT, где U, V - ортогональные матрицы порядка М и N соответственно, D - прямоугольная матрица размера M на N, у которой все элементы, кpоме диагональных элементов dk = dkk, k = 1, 2, ..., N, равны нулю.
Последние M - N столбцов матрицы U, соответствующие заведомо нулевым собственным значениям матрицы AAT, обычно не используются и потому в данной подпрограмме не вычисляются.
Forsythe G.E., Malcolm M.A., Moler C.B. Computer Methods for Mathematical Computation. Prentice-Hall, 1977.
procedure ACP1R(NM :Integer; M :Integer; N :Integer; var A :Array of Real; var W :Array of Real; MATU :Boolean; var U :Array of Real; MATV :Boolean; var V :Array of Real; var RV1 :Array of Real; var IERR :Integer);
Параметры
NM - | число стpок в двумерных массивах A, U, V, причем NM ≥ M (тип: целый); |
M - | число стpок матриц A и U (тип: целый); |
N - | число столбцов матриц A и U и порядок матрицы V (тип: целый); |
A - | вещественный двумерный массив размера NM на N, в первых M стpоках которого задается исходная матрица; |
W - | вещественный вектоp длины N значений W(k) = dk вычисленных сингулярных чисел матрицы A; |
MATU - | признак необходимости вычисления матрицы U: при MATU = TRUE матрица U вычисляется, при MATU = FALSE - нет (тип: логический); |
U - | вещественный двумерный массив размера NM на N, в котоpом при MATU = TRUE содержатся вычисленные первые N столбцов матрицы U; при MATU = FALSE массив U используется как рабочий; |
MATV - | признак необходимости вычисления матрицы V: при MATV = TRUE матрица V вычисляется, при MATV = FALSE - нет (тип: логический); |
V - | вещественный двумерный массив размера NM на N, в котоpом при MATV = TRUE содержится вычисленная матрица V; при MATV = FALSE массив V не используется; |
R - | вещественный рабочий вектоp длины N; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
IERR = K, если для вычисления К - го сингулярного числа потребовалось более 30 итераций; в этом случае правильно вычислены лишь сингулярные числа и сингулярные векторы с индексами K+1, K+2, ..., N. |
Версии
ACP1E - | сингулярное разложение прямоугольной матрицы размера M на N (M ≥ N), заданной с расширенной (Extended) точностью. |
Вызываемые подпрограммы
UTAC10 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм ACP1R и ACP1E. |
Замечания по использованию
1. |
При обращении к подпрограмме ACP1E параметры A, W, U, V, R должны иметь тип Extended. | |
2. |
B результате работы подпрограммы массив A сохраняется. | |
3. |
Допустимо совпадение параметров U или V с параметром A. |
Unit TACP1R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, ACP1R_p; function TACP1R: String; implementation function TACP1R: String; var I,IERR,J,M,N,NM :Integer; A :Array [0..14] of Real; U :Array [0..14] of Real; V :Array [0..14] of Real; SIGМА :Array [0..2] of Real; WORK :Array [0..4] of Real; label _1,_3,_4,_5; begin Result := ''; NM := 5; M := 5; N := 3; for I:=1 to M do begin for J:=1 to N do begin A[(I-1)+(J-1)*5] := I + (J-1)*M; _1: end; end; ACP1R(NM,M,N,A,SIGMA,True,U,True,V,WORK,IERR); if ( IERR <> 0 ) then begin Result := Result + Format('%s',[' IERR=']); Result := Result + Format('%4d',[IERR]) + #$0D#$0A; end; for J:=1 to N do begin Result := Result + Format('%20.16f ',[SIGMA[J-1]]) + #$0D#$0A; _3: end; Result := Result + Format('%s',[' ']) + #$0D#$0A; for I:=1 to M do begin Result := Result + #$0D#$0A; for J:=1 to N do begin Result := Result + Format('%20.16f ',[U[(I-1)+(J-1)*5]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; _4: end; Result := Result + Format('%s',[' ']) + #$0D#$0A; for I:=1 to N do begin Result := Result + #$0D#$0A; for J:=1 to N do begin Result := Result + Format('%20.16f ',[V[(I-1)+(J-1)*5]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; _5: end; UtRes('TACP1R',Result); { вывод результатов в файл TACP1R.res } exit; end; end. Результаты: IERR = 0, | 35.127 | W = | 2.465 | , | 1.587E-11 | | -0.202 0.890 0.408 | V = | -0.517 0.257 -0.816 | , | -0.832 -0.376 0.408 | | -0.355 -0.689 0.602 | | -0.399 -0.376 -0.517 | U = | -0.443 -0.062 -0.306 | | -0.487 0.251 -0.244 | | -0.531 0.564 0.466 |