Parent: [74e6ca] (diff)

Download this file

SVDLib2.def    179 lines (166 with data), 12.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
DEFINITION MODULE SVDLib2;
(*------------------------------------------------------------------------*)
(* Modul zur Singul"arwertzerlegung von dynamisch erzeugten Matrizen *)
(* Siehe hierzu auch die Module DynMat und PMatLib. *)
(* *)
(* Modul providing routines to calculate the singual value decomposition *)
(* of dynamically allocated Matrices (see modules DynMat and PMatLib) *)
(* The SVD routines are based on the Eispack subroutine SVD and LinPack *)
(* subroutine dsvdc with pointer MATRIX definitions. *)
(*------------------------------------------------------------------------*)
(* Implementation : Michael Riedl *)
(* Licence : GNU Lesser General Public License (LGPL) *)
(*------------------------------------------------------------------------*)
(* $Id: SVDLib2.def,v 1.3 2018/08/25 15:04:43 mriedl Exp mriedl $ *)
FROM Deklera IMPORT PMATRIX;
PROCEDURE PdSVD(VAR A : PMATRIX; (* Dynamische Matrix A[1..m,1..n] *)
m,n : INTEGER;
VAR W : ARRAY OF LONGREAL; (* n *)
VAR V : PMATRIX); (* n,n *)
(*----------------------------------------------------------------*)
(* Berechnet die Sigul"arwertzerlegung von A = U W V^+ *)
(* wobei U in A zur"uckgegeben wird. *)
(* Dimensionierungen : A[1..m,1..n],W[1..m],V[1..m,1..m]. *)
(* *)
(* Translation of the Eispack SVD and original Algol60 routines *)
(* *)
(* Lit.: Golub,G.H.; Reinsch,C.; Numer. Math. 14, 403 (1970) *)
(*----------------------------------------------------------------*)
PROCEDURE PSVDSolv(VAR U : PMATRIX; (* m,n *)
Utr : CHAR;
VAR W : ARRAY OF LONGREAL; (* n *)
VAR V : PMATRIX; (* n,n *)
VAR X : ARRAY OF LONGREAL; (* n *)
VAR C : ARRAY OF LONGREAL; (* n *)
m,n : CARDINAL);
(*----------------------------------------------------------------*)
(* Berechnet das lineare Gleichungssystem A X = C, wobei *)
(* A mit der Routine SVD nach A = U W V zerlegt wurde. *)
(* Wenn Utr = {t|T} wird angenommen das U^{tr} uebergeben wurde *)
(*----------------------------------------------------------------*)
PROCEDURE POrderSVD(VAR U : PMATRIX;
VAR W : ARRAY OF LONGREAL;
VAR V : PMATRIX;
m,n : CARDINAL);
(*----------------------------------------------------------------*)
(* Ordnet die SVD-Zerlegung (A = UWV^+) nach Gr"o3e der *)
(* Singulaerwerte W. *)
(*----------------------------------------------------------------*)
PROCEDURE PdSVDc(VAR A : PMATRIX;
m : INTEGER;
n : INTEGER;
VAR S : ARRAY OF LONGREAL;
VAR E : ARRAY OF LONGREAL;
VAR U,V : PMATRIX;
job : INTEGER;
VAR info : INTEGER);
(*----------------------------------------------------------------*)
(* Modula-2 Version der LinPack SUBROUTINE DSVDC *)
(* *)
(* Anpassung an Modula-2 : Michael Riedl *)
(* Lizenz : GNU public licence *)
(* *)
(* Purpose: *)
(* *)
(* DSVDC computes the singular value decomposition of a real *)
(* rectangular matrix. *)
(* *)
(* Discussion: *)
(* *)
(* This routine reduces an M by N matrix A to diagonal form by *)
(* orthogonal transformations U and V. The diagonal elements *)
(* S[i] are the singular values of A. The columns of U are the *)
(* corresponding left singular vectors, and the columns of V *)
(* the right singular vectors. *)
(* *)
(* The form of the singular value decomposition is then *)
(* *)
(* A(MxN) = U(MxM) * S(MxN) * V(NxN)' *)
(* *)
(* Licensing: *)
(* *)
(* This code is distributed under the GNU LGPL license. *)
(* *)
(* Modified: *)
(* *)
(* 03 May 2007 *)
(* *)
(* Author: *)
(* *)
(* Original FORTRAN77 version by *)
(* Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart, *)
(* C version by *)
(* John Burkardt. *)
(* *)
(* Reference: *)
(* *)
(* Jack Dongarra, Cleve Moler, Jim Bunch and Pete Stewart, *)
(* LINPACK User's Guide, *)
(* SIAM, (Society for Industrial and Applied Mathematics), *)
(* 3600 University City Science Center, *)
(* Philadelphia, PA, 19104-2688. *)
(* ISBN 0-89871-172-X *)
(* *)
(* Parameters: *)
(* *)
(* Input/output, double A[LDA*N]. On input, the M by N matrix *)
(* whose singular value decomposition is to be computed. On *)
(* output, the matrix has been destroyed. Depending on the *)
(* user's requests, the matrix may contain other useful *)
(* information. *)
(* *)
(* Input, int LDA, the leading dimension of the array A. *)
(* LDA must be at least M. *)
(* *)
(* Input, int M, the number of rows of the matrix. *)
(* *)
(* Input, int N, the number of columns of the matrix A. *)
(* *)
(* Output, double S[MM], where MM = min(M+1,N). The first *)
(* min(M,N) entries of S contain the singular values of A *)
(* arranged in descending order of magnitude. *)
(* *)
(* Output, double E[MM], where MM = min(M+1,N), ordinarily *)
(* contains zeros. However see the discussion of INFO for *)
(* exceptions. *)
(* *)
(* Output, double U[LDU*K]. If JOBA = 1 then K = M; *)
(* if 2 <= JOBA, then K = min(M,N). U contains the M by M *)
(* matrix of left singular vectors. U is not referenced if *)
(* JOBA = 0. If M <= N or if JOBA = 2, then *)
(* U may be identified with A in the subroutine call. *)
(* *)
(* Input, int LDU, the leading dimension of the array U. *)
(* LDU must be at least M. *)
(* *)
(* Output, double V[LDV*N], the N by N matrix of right *)
(* singular vectors. V is not referenced if JOB is 0. *)
(* If N <= M, then V may be identified with A in the *)
(* subroutine call. *)
(* *)
(* Input, int LDV, the leading dimension of the array V. *)
(* LDV must be at least N. *)
(* *)
(* Input, int JOB, controls the computation of the singular *)
(* vectors. It has the decimal expansion AB with the *)
(* following meaning: *)
(* A = 0, do not compute the left singular vectors. *)
(* A = 1, return the M left singular vectors in U. *)
(* A >= 2, return the first min(M,N) singular vectors in U. *)
(* B = 0, do not compute the right singular vectors. *)
(* B = 1, return the right singular vectors in V. *)
(* *)
(* Output, int *DSVDC, status indicator INFO. *)
(* The singular values (and their corresponding singular *)
(* vectors) S(INFO+1), S(INFO+2),...,S(MN) are correct. *)
(* Here MN = min ( M, N ). *)
(* Thus if *INFO is 0, all the singular values and their *)
(* vectors are correct. In any event, the matrix *)
(* B = U' * A * V is the bidiagonal matrix with the elements *)
(* of S on its diagonal and the elements of E on its *)
(* superdiagonal. Thus the singular values of A and B are *)
(* the same. *)
(* *)
(* Note that the singular values are ordered in decending order *)
(*----------------------------------------------------------------*)
END SVDLib2.