alglib 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +7 -0
- data/Manifest.txt +253 -0
- data/README.txt +33 -0
- data/Rakefile +27 -0
- data/ext/Rakefile +24 -0
- data/ext/alglib.i +24 -0
- data/ext/alglib/Makefile +157 -0
- data/ext/alglib/airyf.cpp +372 -0
- data/ext/alglib/airyf.h +81 -0
- data/ext/alglib/alglib.cpp +8558 -0
- data/ext/alglib/alglib_util.cpp +19 -0
- data/ext/alglib/alglib_util.h +14 -0
- data/ext/alglib/ap.cpp +877 -0
- data/ext/alglib/ap.english.html +364 -0
- data/ext/alglib/ap.h +666 -0
- data/ext/alglib/ap.russian.html +442 -0
- data/ext/alglib/apvt.h +754 -0
- data/ext/alglib/bdss.cpp +1500 -0
- data/ext/alglib/bdss.h +251 -0
- data/ext/alglib/bdsvd.cpp +1339 -0
- data/ext/alglib/bdsvd.h +164 -0
- data/ext/alglib/bessel.cpp +1226 -0
- data/ext/alglib/bessel.h +331 -0
- data/ext/alglib/betaf.cpp +105 -0
- data/ext/alglib/betaf.h +74 -0
- data/ext/alglib/bidiagonal.cpp +1328 -0
- data/ext/alglib/bidiagonal.h +350 -0
- data/ext/alglib/binomialdistr.cpp +247 -0
- data/ext/alglib/binomialdistr.h +153 -0
- data/ext/alglib/blas.cpp +576 -0
- data/ext/alglib/blas.h +132 -0
- data/ext/alglib/cblas.cpp +226 -0
- data/ext/alglib/cblas.h +57 -0
- data/ext/alglib/cdet.cpp +138 -0
- data/ext/alglib/cdet.h +92 -0
- data/ext/alglib/chebyshev.cpp +216 -0
- data/ext/alglib/chebyshev.h +76 -0
- data/ext/alglib/chisquaredistr.cpp +157 -0
- data/ext/alglib/chisquaredistr.h +144 -0
- data/ext/alglib/cholesky.cpp +285 -0
- data/ext/alglib/cholesky.h +86 -0
- data/ext/alglib/cinverse.cpp +298 -0
- data/ext/alglib/cinverse.h +111 -0
- data/ext/alglib/clu.cpp +337 -0
- data/ext/alglib/clu.h +120 -0
- data/ext/alglib/correlation.cpp +280 -0
- data/ext/alglib/correlation.h +77 -0
- data/ext/alglib/correlationtests.cpp +726 -0
- data/ext/alglib/correlationtests.h +134 -0
- data/ext/alglib/crcond.cpp +826 -0
- data/ext/alglib/crcond.h +148 -0
- data/ext/alglib/creflections.cpp +310 -0
- data/ext/alglib/creflections.h +165 -0
- data/ext/alglib/csolve.cpp +312 -0
- data/ext/alglib/csolve.h +99 -0
- data/ext/alglib/ctrinverse.cpp +387 -0
- data/ext/alglib/ctrinverse.h +98 -0
- data/ext/alglib/ctrlinsolve.cpp +297 -0
- data/ext/alglib/ctrlinsolve.h +81 -0
- data/ext/alglib/dawson.cpp +234 -0
- data/ext/alglib/dawson.h +74 -0
- data/ext/alglib/descriptivestatistics.cpp +436 -0
- data/ext/alglib/descriptivestatistics.h +112 -0
- data/ext/alglib/det.cpp +140 -0
- data/ext/alglib/det.h +94 -0
- data/ext/alglib/dforest.cpp +1819 -0
- data/ext/alglib/dforest.h +316 -0
- data/ext/alglib/elliptic.cpp +497 -0
- data/ext/alglib/elliptic.h +217 -0
- data/ext/alglib/estnorm.cpp +429 -0
- data/ext/alglib/estnorm.h +107 -0
- data/ext/alglib/expintegrals.cpp +422 -0
- data/ext/alglib/expintegrals.h +108 -0
- data/ext/alglib/faq.english.html +258 -0
- data/ext/alglib/faq.russian.html +272 -0
- data/ext/alglib/fdistr.cpp +202 -0
- data/ext/alglib/fdistr.h +163 -0
- data/ext/alglib/fresnel.cpp +211 -0
- data/ext/alglib/fresnel.h +91 -0
- data/ext/alglib/gammaf.cpp +338 -0
- data/ext/alglib/gammaf.h +104 -0
- data/ext/alglib/gqgengauss.cpp +235 -0
- data/ext/alglib/gqgengauss.h +92 -0
- data/ext/alglib/gqgenhermite.cpp +268 -0
- data/ext/alglib/gqgenhermite.h +63 -0
- data/ext/alglib/gqgenjacobi.cpp +297 -0
- data/ext/alglib/gqgenjacobi.h +72 -0
- data/ext/alglib/gqgenlaguerre.cpp +265 -0
- data/ext/alglib/gqgenlaguerre.h +69 -0
- data/ext/alglib/gqgenlegendre.cpp +300 -0
- data/ext/alglib/gqgenlegendre.h +62 -0
- data/ext/alglib/gqgenlobatto.cpp +305 -0
- data/ext/alglib/gqgenlobatto.h +97 -0
- data/ext/alglib/gqgenradau.cpp +232 -0
- data/ext/alglib/gqgenradau.h +95 -0
- data/ext/alglib/hbisinv.cpp +480 -0
- data/ext/alglib/hbisinv.h +183 -0
- data/ext/alglib/hblas.cpp +228 -0
- data/ext/alglib/hblas.h +64 -0
- data/ext/alglib/hcholesky.cpp +339 -0
- data/ext/alglib/hcholesky.h +91 -0
- data/ext/alglib/hermite.cpp +114 -0
- data/ext/alglib/hermite.h +49 -0
- data/ext/alglib/hessenberg.cpp +370 -0
- data/ext/alglib/hessenberg.h +152 -0
- data/ext/alglib/hevd.cpp +247 -0
- data/ext/alglib/hevd.h +107 -0
- data/ext/alglib/hsschur.cpp +1316 -0
- data/ext/alglib/hsschur.h +108 -0
- data/ext/alglib/htridiagonal.cpp +734 -0
- data/ext/alglib/htridiagonal.h +180 -0
- data/ext/alglib/ialglib.cpp +6 -0
- data/ext/alglib/ialglib.h +9 -0
- data/ext/alglib/ibetaf.cpp +960 -0
- data/ext/alglib/ibetaf.h +125 -0
- data/ext/alglib/igammaf.cpp +430 -0
- data/ext/alglib/igammaf.h +157 -0
- data/ext/alglib/inv.cpp +274 -0
- data/ext/alglib/inv.h +115 -0
- data/ext/alglib/inverseupdate.cpp +480 -0
- data/ext/alglib/inverseupdate.h +185 -0
- data/ext/alglib/jacobianelliptic.cpp +164 -0
- data/ext/alglib/jacobianelliptic.h +94 -0
- data/ext/alglib/jarquebera.cpp +2271 -0
- data/ext/alglib/jarquebera.h +80 -0
- data/ext/alglib/kmeans.cpp +356 -0
- data/ext/alglib/kmeans.h +76 -0
- data/ext/alglib/laguerre.cpp +94 -0
- data/ext/alglib/laguerre.h +48 -0
- data/ext/alglib/lbfgs.cpp +1167 -0
- data/ext/alglib/lbfgs.h +218 -0
- data/ext/alglib/lda.cpp +434 -0
- data/ext/alglib/lda.h +133 -0
- data/ext/alglib/ldlt.cpp +1130 -0
- data/ext/alglib/ldlt.h +124 -0
- data/ext/alglib/leastsquares.cpp +1252 -0
- data/ext/alglib/leastsquares.h +290 -0
- data/ext/alglib/legendre.cpp +107 -0
- data/ext/alglib/legendre.h +49 -0
- data/ext/alglib/linreg.cpp +1185 -0
- data/ext/alglib/linreg.h +380 -0
- data/ext/alglib/logit.cpp +1523 -0
- data/ext/alglib/logit.h +333 -0
- data/ext/alglib/lq.cpp +399 -0
- data/ext/alglib/lq.h +160 -0
- data/ext/alglib/lu.cpp +462 -0
- data/ext/alglib/lu.h +119 -0
- data/ext/alglib/mannwhitneyu.cpp +4490 -0
- data/ext/alglib/mannwhitneyu.h +115 -0
- data/ext/alglib/minlm.cpp +918 -0
- data/ext/alglib/minlm.h +312 -0
- data/ext/alglib/mlpbase.cpp +3375 -0
- data/ext/alglib/mlpbase.h +589 -0
- data/ext/alglib/mlpe.cpp +1369 -0
- data/ext/alglib/mlpe.h +552 -0
- data/ext/alglib/mlptrain.cpp +1056 -0
- data/ext/alglib/mlptrain.h +283 -0
- data/ext/alglib/nearunityunit.cpp +91 -0
- data/ext/alglib/nearunityunit.h +17 -0
- data/ext/alglib/normaldistr.cpp +377 -0
- data/ext/alglib/normaldistr.h +175 -0
- data/ext/alglib/nsevd.cpp +1869 -0
- data/ext/alglib/nsevd.h +140 -0
- data/ext/alglib/pca.cpp +168 -0
- data/ext/alglib/pca.h +87 -0
- data/ext/alglib/poissondistr.cpp +143 -0
- data/ext/alglib/poissondistr.h +130 -0
- data/ext/alglib/polinterpolation.cpp +685 -0
- data/ext/alglib/polinterpolation.h +206 -0
- data/ext/alglib/psif.cpp +173 -0
- data/ext/alglib/psif.h +88 -0
- data/ext/alglib/qr.cpp +414 -0
- data/ext/alglib/qr.h +168 -0
- data/ext/alglib/ratinterpolation.cpp +134 -0
- data/ext/alglib/ratinterpolation.h +72 -0
- data/ext/alglib/rcond.cpp +705 -0
- data/ext/alglib/rcond.h +140 -0
- data/ext/alglib/reflections.cpp +504 -0
- data/ext/alglib/reflections.h +165 -0
- data/ext/alglib/rotations.cpp +473 -0
- data/ext/alglib/rotations.h +128 -0
- data/ext/alglib/rsolve.cpp +221 -0
- data/ext/alglib/rsolve.h +99 -0
- data/ext/alglib/sbisinv.cpp +217 -0
- data/ext/alglib/sbisinv.h +171 -0
- data/ext/alglib/sblas.cpp +185 -0
- data/ext/alglib/sblas.h +64 -0
- data/ext/alglib/schur.cpp +156 -0
- data/ext/alglib/schur.h +102 -0
- data/ext/alglib/sdet.cpp +193 -0
- data/ext/alglib/sdet.h +101 -0
- data/ext/alglib/sevd.cpp +116 -0
- data/ext/alglib/sevd.h +99 -0
- data/ext/alglib/sinverse.cpp +672 -0
- data/ext/alglib/sinverse.h +138 -0
- data/ext/alglib/spddet.cpp +138 -0
- data/ext/alglib/spddet.h +96 -0
- data/ext/alglib/spdgevd.cpp +842 -0
- data/ext/alglib/spdgevd.h +200 -0
- data/ext/alglib/spdinverse.cpp +509 -0
- data/ext/alglib/spdinverse.h +122 -0
- data/ext/alglib/spdrcond.cpp +421 -0
- data/ext/alglib/spdrcond.h +118 -0
- data/ext/alglib/spdsolve.cpp +275 -0
- data/ext/alglib/spdsolve.h +105 -0
- data/ext/alglib/spline2d.cpp +1192 -0
- data/ext/alglib/spline2d.h +301 -0
- data/ext/alglib/spline3.cpp +1264 -0
- data/ext/alglib/spline3.h +290 -0
- data/ext/alglib/srcond.cpp +595 -0
- data/ext/alglib/srcond.h +127 -0
- data/ext/alglib/ssolve.cpp +895 -0
- data/ext/alglib/ssolve.h +139 -0
- data/ext/alglib/stdafx.h +0 -0
- data/ext/alglib/stest.cpp +131 -0
- data/ext/alglib/stest.h +94 -0
- data/ext/alglib/studenttdistr.cpp +222 -0
- data/ext/alglib/studenttdistr.h +115 -0
- data/ext/alglib/studentttests.cpp +377 -0
- data/ext/alglib/studentttests.h +178 -0
- data/ext/alglib/svd.cpp +620 -0
- data/ext/alglib/svd.h +126 -0
- data/ext/alglib/tdbisinv.cpp +2608 -0
- data/ext/alglib/tdbisinv.h +228 -0
- data/ext/alglib/tdevd.cpp +1229 -0
- data/ext/alglib/tdevd.h +115 -0
- data/ext/alglib/tridiagonal.cpp +594 -0
- data/ext/alglib/tridiagonal.h +171 -0
- data/ext/alglib/trigintegrals.cpp +490 -0
- data/ext/alglib/trigintegrals.h +131 -0
- data/ext/alglib/trinverse.cpp +345 -0
- data/ext/alglib/trinverse.h +98 -0
- data/ext/alglib/trlinsolve.cpp +926 -0
- data/ext/alglib/trlinsolve.h +73 -0
- data/ext/alglib/tsort.cpp +405 -0
- data/ext/alglib/tsort.h +54 -0
- data/ext/alglib/variancetests.cpp +245 -0
- data/ext/alglib/variancetests.h +134 -0
- data/ext/alglib/wsr.cpp +6285 -0
- data/ext/alglib/wsr.h +96 -0
- data/ext/ap.i +97 -0
- data/ext/correlation.i +24 -0
- data/ext/extconf.rb +6 -0
- data/ext/logit.i +89 -0
- data/lib/alglib.rb +71 -0
- data/lib/alglib/correlation.rb +26 -0
- data/lib/alglib/linearregression.rb +63 -0
- data/lib/alglib/logit.rb +42 -0
- data/test/test_alglib.rb +52 -0
- data/test/test_correlation.rb +44 -0
- data/test/test_correlationtest.rb +45 -0
- data/test/test_linreg.rb +35 -0
- data/test/test_logit.rb +43 -0
- data/test/test_pca.rb +27 -0
- metadata +326 -0
data/ext/alglib/lq.h
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
/*************************************************************************
|
2
|
+
Copyright (c) 2005-2007, Sergey Bochkanov (ALGLIB project).
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are
|
6
|
+
met:
|
7
|
+
|
8
|
+
- Redistributions of source code must retain the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
- Redistributions in binary form must reproduce the above copyright
|
12
|
+
notice, this list of conditions and the following disclaimer listed
|
13
|
+
in this license in the documentation and/or other materials
|
14
|
+
provided with the distribution.
|
15
|
+
|
16
|
+
- Neither the name of the copyright holders nor the names of its
|
17
|
+
contributors may be used to endorse or promote products derived from
|
18
|
+
this software without specific prior written permission.
|
19
|
+
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*************************************************************************/
|
32
|
+
|
33
|
+
#ifndef _lq_h
|
34
|
+
#define _lq_h
|
35
|
+
|
36
|
+
#include "ap.h"
|
37
|
+
#include "ialglib.h"
|
38
|
+
|
39
|
+
#include "reflections.h"
|
40
|
+
|
41
|
+
|
42
|
+
/*************************************************************************
|
43
|
+
LQ decomposition of a rectangular matrix of size MxN
|
44
|
+
|
45
|
+
Input parameters:
|
46
|
+
A - matrix A whose indexes range within [0..M-1, 0..N-1].
|
47
|
+
M - number of rows in matrix A.
|
48
|
+
N - number of columns in matrix A.
|
49
|
+
|
50
|
+
Output parameters:
|
51
|
+
A - matrices L and Q in compact form (see below)
|
52
|
+
Tau - array of scalar factors which are used to form
|
53
|
+
matrix Q. Array whose index ranges within [0..Min(M,N)-1].
|
54
|
+
|
55
|
+
Matrix A is represented as A = LQ, where Q is an orthogonal matrix of size
|
56
|
+
MxM, L - lower triangular (or lower trapezoid) matrix of size M x N.
|
57
|
+
|
58
|
+
The elements of matrix L are located on and below the main diagonal of
|
59
|
+
matrix A. The elements which are located in Tau array and above the main
|
60
|
+
diagonal of matrix A are used to form matrix Q as follows:
|
61
|
+
|
62
|
+
Matrix Q is represented as a product of elementary reflections
|
63
|
+
|
64
|
+
Q = H(k-1)*H(k-2)*...*H(1)*H(0),
|
65
|
+
|
66
|
+
where k = min(m,n), and each H(i) is of the form
|
67
|
+
|
68
|
+
H(i) = 1 - tau * v * (v^T)
|
69
|
+
|
70
|
+
where tau is a scalar stored in Tau[I]; v - real vector, so that v(0:i-1)=0,
|
71
|
+
v(i) = 1, v(i+1:n-1) stored in A(i,i+1:n-1).
|
72
|
+
|
73
|
+
-- ALGLIB --
|
74
|
+
Copyright 2005-2007 by Bochkanov Sergey
|
75
|
+
*************************************************************************/
|
76
|
+
void rmatrixlq(ap::real_2d_array& a, int m, int n, ap::real_1d_array& tau);
|
77
|
+
|
78
|
+
|
79
|
+
/*************************************************************************
|
80
|
+
Partial unpacking of matrix Q from the LQ decomposition of a matrix A
|
81
|
+
|
82
|
+
Input parameters:
|
83
|
+
A - matrices L and Q in compact form.
|
84
|
+
Output of RMatrixLQ subroutine.
|
85
|
+
M - number of rows in given matrix A. M>=0.
|
86
|
+
N - number of columns in given matrix A. N>=0.
|
87
|
+
Tau - scalar factors which are used to form Q.
|
88
|
+
Output of the RMatrixLQ subroutine.
|
89
|
+
QRows - required number of rows in matrix Q. N>=QRows>=0.
|
90
|
+
|
91
|
+
Output parameters:
|
92
|
+
Q - first QRows rows of matrix Q. Array whose indexes range
|
93
|
+
within [0..QRows-1, 0..N-1]. If QRows=0, the array remains
|
94
|
+
unchanged.
|
95
|
+
|
96
|
+
-- ALGLIB --
|
97
|
+
Copyright 2005 by Bochkanov Sergey
|
98
|
+
*************************************************************************/
|
99
|
+
void rmatrixlqunpackq(const ap::real_2d_array& a,
|
100
|
+
int m,
|
101
|
+
int n,
|
102
|
+
const ap::real_1d_array& tau,
|
103
|
+
int qrows,
|
104
|
+
ap::real_2d_array& q);
|
105
|
+
|
106
|
+
|
107
|
+
/*************************************************************************
|
108
|
+
Unpacking of matrix L from the LQ decomposition of a matrix A
|
109
|
+
|
110
|
+
Input parameters:
|
111
|
+
A - matrices Q and L in compact form.
|
112
|
+
Output of RMatrixLQ subroutine.
|
113
|
+
M - number of rows in given matrix A. M>=0.
|
114
|
+
N - number of columns in given matrix A. N>=0.
|
115
|
+
|
116
|
+
Output parameters:
|
117
|
+
L - matrix L, array[0..M-1, 0..N-1].
|
118
|
+
|
119
|
+
-- ALGLIB --
|
120
|
+
Copyright 2005 by Bochkanov Sergey
|
121
|
+
*************************************************************************/
|
122
|
+
void rmatrixlqunpackl(const ap::real_2d_array& a,
|
123
|
+
int m,
|
124
|
+
int n,
|
125
|
+
ap::real_2d_array& l);
|
126
|
+
|
127
|
+
|
128
|
+
/*************************************************************************
|
129
|
+
Obsolete 1-based subroutine
|
130
|
+
See RMatrixLQ for 0-based replacement.
|
131
|
+
*************************************************************************/
|
132
|
+
void lqdecomposition(ap::real_2d_array& a,
|
133
|
+
int m,
|
134
|
+
int n,
|
135
|
+
ap::real_1d_array& tau);
|
136
|
+
|
137
|
+
|
138
|
+
/*************************************************************************
|
139
|
+
Obsolete 1-based subroutine
|
140
|
+
See RMatrixLQUnpackQ for 0-based replacement.
|
141
|
+
*************************************************************************/
|
142
|
+
void unpackqfromlq(const ap::real_2d_array& a,
|
143
|
+
int m,
|
144
|
+
int n,
|
145
|
+
const ap::real_1d_array& tau,
|
146
|
+
int qrows,
|
147
|
+
ap::real_2d_array& q);
|
148
|
+
|
149
|
+
|
150
|
+
/*************************************************************************
|
151
|
+
Obsolete 1-based subroutine
|
152
|
+
*************************************************************************/
|
153
|
+
void lqdecompositionunpacked(ap::real_2d_array a,
|
154
|
+
int m,
|
155
|
+
int n,
|
156
|
+
ap::real_2d_array& l,
|
157
|
+
ap::real_2d_array& q);
|
158
|
+
|
159
|
+
|
160
|
+
#endif
|
data/ext/alglib/lu.cpp
ADDED
@@ -0,0 +1,462 @@
|
|
1
|
+
/*************************************************************************
|
2
|
+
Copyright (c) 1992-2007 The University of Tennessee. All rights reserved.
|
3
|
+
|
4
|
+
Contributors:
|
5
|
+
* Sergey Bochkanov (ALGLIB project). Translation from FORTRAN to
|
6
|
+
pseudocode.
|
7
|
+
|
8
|
+
See subroutines comments for additional copyrights.
|
9
|
+
|
10
|
+
Redistribution and use in source and binary forms, with or without
|
11
|
+
modification, are permitted provided that the following conditions are
|
12
|
+
met:
|
13
|
+
|
14
|
+
- Redistributions of source code must retain the above copyright
|
15
|
+
notice, this list of conditions and the following disclaimer.
|
16
|
+
|
17
|
+
- Redistributions in binary form must reproduce the above copyright
|
18
|
+
notice, this list of conditions and the following disclaimer listed
|
19
|
+
in this license in the documentation and/or other materials
|
20
|
+
provided with the distribution.
|
21
|
+
|
22
|
+
- Neither the name of the copyright holders nor the names of its
|
23
|
+
contributors may be used to endorse or promote products derived from
|
24
|
+
this software without specific prior written permission.
|
25
|
+
|
26
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
27
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
28
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
29
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
30
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
31
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
32
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
33
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
34
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
35
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
36
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
37
|
+
*************************************************************************/
|
38
|
+
|
39
|
+
#include <stdafx.h>
|
40
|
+
#include "lu.h"
|
41
|
+
|
42
|
+
static const int lunb = 8;
|
43
|
+
|
44
|
+
static void rmatrixlu2(ap::real_2d_array& a,
|
45
|
+
int m,
|
46
|
+
int n,
|
47
|
+
ap::integer_1d_array& pivots);
|
48
|
+
|
49
|
+
/*************************************************************************
|
50
|
+
LU decomposition of a general matrix of size MxN
|
51
|
+
|
52
|
+
The subroutine calculates the LU decomposition of a rectangular general
|
53
|
+
matrix with partial pivoting (with row permutations).
|
54
|
+
|
55
|
+
Input parameters:
|
56
|
+
A - matrix A whose indexes range within [0..M-1, 0..N-1].
|
57
|
+
M - number of rows in matrix A.
|
58
|
+
N - number of columns in matrix A.
|
59
|
+
|
60
|
+
Output parameters:
|
61
|
+
A - matrices L and U in compact form (see below).
|
62
|
+
Array whose indexes range within [0..M-1, 0..N-1].
|
63
|
+
Pivots - permutation matrix in compact form (see below).
|
64
|
+
Array whose index ranges within [0..Min(M-1,N-1)].
|
65
|
+
|
66
|
+
Matrix A is represented as A = P * L * U, where P is a permutation matrix,
|
67
|
+
matrix L - lower triangular (or lower trapezoid, if M>N) matrix,
|
68
|
+
U - upper triangular (or upper trapezoid, if M<N) matrix.
|
69
|
+
|
70
|
+
Let M be equal to 4 and N be equal to 3:
|
71
|
+
|
72
|
+
( 1 ) ( U11 U12 U13 )
|
73
|
+
A = P1 * P2 * P3 * ( L21 1 ) * ( U22 U23 )
|
74
|
+
( L31 L32 1 ) ( U33 )
|
75
|
+
( L41 L42 L43 )
|
76
|
+
|
77
|
+
Matrix L has size MxMin(M,N), matrix U has size Min(M,N)xN, matrix P(i) is
|
78
|
+
a permutation of the identity matrix of size MxM with numbers I and Pivots[I].
|
79
|
+
|
80
|
+
The algorithm returns array Pivots and the following matrix which replaces
|
81
|
+
matrix A and contains matrices L and U in compact form (the example applies
|
82
|
+
to M=4, N=3).
|
83
|
+
|
84
|
+
( U11 U12 U13 )
|
85
|
+
( L21 U22 U23 )
|
86
|
+
( L31 L32 U33 )
|
87
|
+
( L41 L42 L43 )
|
88
|
+
|
89
|
+
As we can see, the unit diagonal isn't stored.
|
90
|
+
|
91
|
+
-- LAPACK routine (version 3.0) --
|
92
|
+
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
93
|
+
Courant Institute, Argonne National Lab, and Rice University
|
94
|
+
June 30, 1992
|
95
|
+
*************************************************************************/
|
96
|
+
void rmatrixlu(ap::real_2d_array& a,
|
97
|
+
int m,
|
98
|
+
int n,
|
99
|
+
ap::integer_1d_array& pivots)
|
100
|
+
{
|
101
|
+
ap::real_2d_array b;
|
102
|
+
ap::real_1d_array t;
|
103
|
+
ap::integer_1d_array bp;
|
104
|
+
int minmn;
|
105
|
+
int i;
|
106
|
+
int ip;
|
107
|
+
int j;
|
108
|
+
int j1;
|
109
|
+
int j2;
|
110
|
+
int cb;
|
111
|
+
int nb;
|
112
|
+
double v;
|
113
|
+
|
114
|
+
ap::ap_error::make_assertion(lunb>=1, "RMatrixLU internal error");
|
115
|
+
nb = lunb;
|
116
|
+
|
117
|
+
//
|
118
|
+
// Decide what to use - blocked or unblocked code
|
119
|
+
//
|
120
|
+
if( n<=1||ap::minint(m, n)<=nb||nb==1 )
|
121
|
+
{
|
122
|
+
|
123
|
+
//
|
124
|
+
// Unblocked code
|
125
|
+
//
|
126
|
+
rmatrixlu2(a, m, n, pivots);
|
127
|
+
}
|
128
|
+
else
|
129
|
+
{
|
130
|
+
|
131
|
+
//
|
132
|
+
// Blocked code.
|
133
|
+
// First, prepare temporary matrix and indices
|
134
|
+
//
|
135
|
+
b.setbounds(0, m-1, 0, nb-1);
|
136
|
+
t.setbounds(0, n-1);
|
137
|
+
pivots.setbounds(0, ap::minint(m, n)-1);
|
138
|
+
minmn = ap::minint(m, n);
|
139
|
+
j1 = 0;
|
140
|
+
j2 = ap::minint(minmn, nb)-1;
|
141
|
+
|
142
|
+
//
|
143
|
+
// Main cycle
|
144
|
+
//
|
145
|
+
while(j1<minmn)
|
146
|
+
{
|
147
|
+
cb = j2-j1+1;
|
148
|
+
|
149
|
+
//
|
150
|
+
// LU factorization of diagonal and subdiagonal blocks:
|
151
|
+
// 1. Copy columns J1..J2 of A to B
|
152
|
+
// 2. LU(B)
|
153
|
+
// 3. Copy result back to A
|
154
|
+
// 4. Copy pivots, apply pivots
|
155
|
+
//
|
156
|
+
for(i = j1; i <= m-1; i++)
|
157
|
+
{
|
158
|
+
ap::vmove(&b(i-j1, 0), &a(i, j1), ap::vlen(0,cb-1));
|
159
|
+
}
|
160
|
+
rmatrixlu2(b, m-j1, cb, bp);
|
161
|
+
for(i = j1; i <= m-1; i++)
|
162
|
+
{
|
163
|
+
ap::vmove(&a(i, j1), &b(i-j1, 0), ap::vlen(j1,j2));
|
164
|
+
}
|
165
|
+
for(i = 0; i <= cb-1; i++)
|
166
|
+
{
|
167
|
+
ip = bp(i);
|
168
|
+
pivots(j1+i) = j1+ip;
|
169
|
+
if( bp(i)!=i )
|
170
|
+
{
|
171
|
+
if( j1!=0 )
|
172
|
+
{
|
173
|
+
|
174
|
+
//
|
175
|
+
// Interchange columns 0:J1-1
|
176
|
+
//
|
177
|
+
ap::vmove(&t(0), &a(j1+i, 0), ap::vlen(0,j1-1));
|
178
|
+
ap::vmove(&a(j1+i, 0), &a(j1+ip, 0), ap::vlen(0,j1-1));
|
179
|
+
ap::vmove(&a(j1+ip, 0), &t(0), ap::vlen(0,j1-1));
|
180
|
+
}
|
181
|
+
if( j2<n-1 )
|
182
|
+
{
|
183
|
+
|
184
|
+
//
|
185
|
+
// Interchange the rest of the matrix, if needed
|
186
|
+
//
|
187
|
+
ap::vmove(&t(j2+1), &a(j1+i, j2+1), ap::vlen(j2+1,n-1));
|
188
|
+
ap::vmove(&a(j1+i, j2+1), &a(j1+ip, j2+1), ap::vlen(j2+1,n-1));
|
189
|
+
ap::vmove(&a(j1+ip, j2+1), &t(j2+1), ap::vlen(j2+1,n-1));
|
190
|
+
}
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
//
|
195
|
+
// Compute block row of U
|
196
|
+
//
|
197
|
+
if( j2<n-1 )
|
198
|
+
{
|
199
|
+
for(i = j1+1; i <= j2; i++)
|
200
|
+
{
|
201
|
+
for(j = j1; j <= i-1; j++)
|
202
|
+
{
|
203
|
+
v = a(i,j);
|
204
|
+
ap::vsub(&a(i, j2+1), &a(j, j2+1), ap::vlen(j2+1,n-1), v);
|
205
|
+
}
|
206
|
+
}
|
207
|
+
}
|
208
|
+
|
209
|
+
//
|
210
|
+
// Update trailing submatrix
|
211
|
+
//
|
212
|
+
if( j2<n-1 )
|
213
|
+
{
|
214
|
+
for(i = j2+1; i <= m-1; i++)
|
215
|
+
{
|
216
|
+
for(j = j1; j <= j2; j++)
|
217
|
+
{
|
218
|
+
v = a(i,j);
|
219
|
+
ap::vsub(&a(i, j2+1), &a(j, j2+1), ap::vlen(j2+1,n-1), v);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
}
|
223
|
+
|
224
|
+
//
|
225
|
+
// Next step
|
226
|
+
//
|
227
|
+
j1 = j2+1;
|
228
|
+
j2 = ap::minint(minmn, j1+nb)-1;
|
229
|
+
}
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
|
234
|
+
/*************************************************************************
|
235
|
+
Obsolete 1-based subroutine. Left for backward compatibility.
|
236
|
+
See RMatrixLU for 0-based replacement.
|
237
|
+
*************************************************************************/
|
238
|
+
void ludecomposition(ap::real_2d_array& a,
|
239
|
+
int m,
|
240
|
+
int n,
|
241
|
+
ap::integer_1d_array& pivots)
|
242
|
+
{
|
243
|
+
int i;
|
244
|
+
int j;
|
245
|
+
int jp;
|
246
|
+
ap::real_1d_array t1;
|
247
|
+
double s;
|
248
|
+
|
249
|
+
pivots.setbounds(1, ap::minint(m, n));
|
250
|
+
t1.setbounds(1, ap::maxint(m, n));
|
251
|
+
ap::ap_error::make_assertion(m>=0&&n>=0, "Error in LUDecomposition: incorrect function arguments");
|
252
|
+
|
253
|
+
//
|
254
|
+
// Quick return if possible
|
255
|
+
//
|
256
|
+
if( m==0||n==0 )
|
257
|
+
{
|
258
|
+
return;
|
259
|
+
}
|
260
|
+
for(j = 1; j <= ap::minint(m, n); j++)
|
261
|
+
{
|
262
|
+
|
263
|
+
//
|
264
|
+
// Find pivot and test for singularity.
|
265
|
+
//
|
266
|
+
jp = j;
|
267
|
+
for(i = j+1; i <= m; i++)
|
268
|
+
{
|
269
|
+
if( fabs(a(i,j))>fabs(a(jp,j)) )
|
270
|
+
{
|
271
|
+
jp = i;
|
272
|
+
}
|
273
|
+
}
|
274
|
+
pivots(j) = jp;
|
275
|
+
if( a(jp,j)!=0 )
|
276
|
+
{
|
277
|
+
|
278
|
+
//
|
279
|
+
//Apply the interchange to rows
|
280
|
+
//
|
281
|
+
if( jp!=j )
|
282
|
+
{
|
283
|
+
ap::vmove(&t1(1), &a(j, 1), ap::vlen(1,n));
|
284
|
+
ap::vmove(&a(j, 1), &a(jp, 1), ap::vlen(1,n));
|
285
|
+
ap::vmove(&a(jp, 1), &t1(1), ap::vlen(1,n));
|
286
|
+
}
|
287
|
+
|
288
|
+
//
|
289
|
+
//Compute elements J+1:M of J-th column.
|
290
|
+
//
|
291
|
+
if( j<m )
|
292
|
+
{
|
293
|
+
|
294
|
+
//
|
295
|
+
// CALL DSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 )
|
296
|
+
//
|
297
|
+
jp = j+1;
|
298
|
+
s = 1/a(j,j);
|
299
|
+
ap::vmul(a.getcolumn(j, jp, m), s);
|
300
|
+
}
|
301
|
+
}
|
302
|
+
if( j<ap::minint(m, n) )
|
303
|
+
{
|
304
|
+
|
305
|
+
//
|
306
|
+
//Update trailing submatrix.
|
307
|
+
//CALL DGER( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ), LDA,A( J+1, J+1 ), LDA )
|
308
|
+
//
|
309
|
+
jp = j+1;
|
310
|
+
for(i = j+1; i <= m; i++)
|
311
|
+
{
|
312
|
+
s = a(i,j);
|
313
|
+
ap::vsub(&a(i, jp), &a(j, jp), ap::vlen(jp,n), s);
|
314
|
+
}
|
315
|
+
}
|
316
|
+
}
|
317
|
+
}
|
318
|
+
|
319
|
+
|
320
|
+
/*************************************************************************
|
321
|
+
Obsolete 1-based subroutine. Left for backward compatibility.
|
322
|
+
*************************************************************************/
|
323
|
+
void ludecompositionunpacked(ap::real_2d_array a,
|
324
|
+
int m,
|
325
|
+
int n,
|
326
|
+
ap::real_2d_array& l,
|
327
|
+
ap::real_2d_array& u,
|
328
|
+
ap::integer_1d_array& pivots)
|
329
|
+
{
|
330
|
+
int i;
|
331
|
+
int j;
|
332
|
+
int minmn;
|
333
|
+
|
334
|
+
if( m==0||n==0 )
|
335
|
+
{
|
336
|
+
return;
|
337
|
+
}
|
338
|
+
minmn = ap::minint(m, n);
|
339
|
+
l.setbounds(1, m, 1, minmn);
|
340
|
+
u.setbounds(1, minmn, 1, n);
|
341
|
+
ludecomposition(a, m, n, pivots);
|
342
|
+
for(i = 1; i <= m; i++)
|
343
|
+
{
|
344
|
+
for(j = 1; j <= minmn; j++)
|
345
|
+
{
|
346
|
+
if( j>i )
|
347
|
+
{
|
348
|
+
l(i,j) = 0;
|
349
|
+
}
|
350
|
+
if( j==i )
|
351
|
+
{
|
352
|
+
l(i,j) = 1;
|
353
|
+
}
|
354
|
+
if( j<i )
|
355
|
+
{
|
356
|
+
l(i,j) = a(i,j);
|
357
|
+
}
|
358
|
+
}
|
359
|
+
}
|
360
|
+
for(i = 1; i <= minmn; i++)
|
361
|
+
{
|
362
|
+
for(j = 1; j <= n; j++)
|
363
|
+
{
|
364
|
+
if( j<i )
|
365
|
+
{
|
366
|
+
u(i,j) = 0;
|
367
|
+
}
|
368
|
+
if( j>=i )
|
369
|
+
{
|
370
|
+
u(i,j) = a(i,j);
|
371
|
+
}
|
372
|
+
}
|
373
|
+
}
|
374
|
+
}
|
375
|
+
|
376
|
+
|
377
|
+
/*************************************************************************
|
378
|
+
Level 2 BLAS version of RMatrixLU
|
379
|
+
|
380
|
+
-- LAPACK routine (version 3.0) --
|
381
|
+
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
382
|
+
Courant Institute, Argonne National Lab, and Rice University
|
383
|
+
June 30, 1992
|
384
|
+
*************************************************************************/
|
385
|
+
static void rmatrixlu2(ap::real_2d_array& a,
|
386
|
+
int m,
|
387
|
+
int n,
|
388
|
+
ap::integer_1d_array& pivots)
|
389
|
+
{
|
390
|
+
int i;
|
391
|
+
int j;
|
392
|
+
int jp;
|
393
|
+
ap::real_1d_array t1;
|
394
|
+
double s;
|
395
|
+
|
396
|
+
pivots.setbounds(0, ap::minint(m-1, n-1));
|
397
|
+
t1.setbounds(0, ap::maxint(m-1, n-1));
|
398
|
+
ap::ap_error::make_assertion(m>=0&&n>=0, "Error in LUDecomposition: incorrect function arguments");
|
399
|
+
|
400
|
+
//
|
401
|
+
// Quick return if possible
|
402
|
+
//
|
403
|
+
if( m==0||n==0 )
|
404
|
+
{
|
405
|
+
return;
|
406
|
+
}
|
407
|
+
for(j = 0; j <= ap::minint(m-1, n-1); j++)
|
408
|
+
{
|
409
|
+
|
410
|
+
//
|
411
|
+
// Find pivot and test for singularity.
|
412
|
+
//
|
413
|
+
jp = j;
|
414
|
+
for(i = j+1; i <= m-1; i++)
|
415
|
+
{
|
416
|
+
if( fabs(a(i,j))>fabs(a(jp,j)) )
|
417
|
+
{
|
418
|
+
jp = i;
|
419
|
+
}
|
420
|
+
}
|
421
|
+
pivots(j) = jp;
|
422
|
+
if( a(jp,j)!=0 )
|
423
|
+
{
|
424
|
+
|
425
|
+
//
|
426
|
+
//Apply the interchange to rows
|
427
|
+
//
|
428
|
+
if( jp!=j )
|
429
|
+
{
|
430
|
+
ap::vmove(&t1(0), &a(j, 0), ap::vlen(0,n-1));
|
431
|
+
ap::vmove(&a(j, 0), &a(jp, 0), ap::vlen(0,n-1));
|
432
|
+
ap::vmove(&a(jp, 0), &t1(0), ap::vlen(0,n-1));
|
433
|
+
}
|
434
|
+
|
435
|
+
//
|
436
|
+
//Compute elements J+1:M of J-th column.
|
437
|
+
//
|
438
|
+
if( j<m )
|
439
|
+
{
|
440
|
+
jp = j+1;
|
441
|
+
s = 1/a(j,j);
|
442
|
+
ap::vmul(a.getcolumn(j, jp, m-1), s);
|
443
|
+
}
|
444
|
+
}
|
445
|
+
if( j<ap::minint(m, n)-1 )
|
446
|
+
{
|
447
|
+
|
448
|
+
//
|
449
|
+
//Update trailing submatrix.
|
450
|
+
//
|
451
|
+
jp = j+1;
|
452
|
+
for(i = j+1; i <= m-1; i++)
|
453
|
+
{
|
454
|
+
s = a(i,j);
|
455
|
+
ap::vsub(&a(i, jp), &a(j, jp), ap::vlen(jp,n-1), s);
|
456
|
+
}
|
457
|
+
}
|
458
|
+
}
|
459
|
+
}
|
460
|
+
|
461
|
+
|
462
|
+
|