alglib 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. data/History.txt +7 -0
  2. data/Manifest.txt +253 -0
  3. data/README.txt +33 -0
  4. data/Rakefile +27 -0
  5. data/ext/Rakefile +24 -0
  6. data/ext/alglib.i +24 -0
  7. data/ext/alglib/Makefile +157 -0
  8. data/ext/alglib/airyf.cpp +372 -0
  9. data/ext/alglib/airyf.h +81 -0
  10. data/ext/alglib/alglib.cpp +8558 -0
  11. data/ext/alglib/alglib_util.cpp +19 -0
  12. data/ext/alglib/alglib_util.h +14 -0
  13. data/ext/alglib/ap.cpp +877 -0
  14. data/ext/alglib/ap.english.html +364 -0
  15. data/ext/alglib/ap.h +666 -0
  16. data/ext/alglib/ap.russian.html +442 -0
  17. data/ext/alglib/apvt.h +754 -0
  18. data/ext/alglib/bdss.cpp +1500 -0
  19. data/ext/alglib/bdss.h +251 -0
  20. data/ext/alglib/bdsvd.cpp +1339 -0
  21. data/ext/alglib/bdsvd.h +164 -0
  22. data/ext/alglib/bessel.cpp +1226 -0
  23. data/ext/alglib/bessel.h +331 -0
  24. data/ext/alglib/betaf.cpp +105 -0
  25. data/ext/alglib/betaf.h +74 -0
  26. data/ext/alglib/bidiagonal.cpp +1328 -0
  27. data/ext/alglib/bidiagonal.h +350 -0
  28. data/ext/alglib/binomialdistr.cpp +247 -0
  29. data/ext/alglib/binomialdistr.h +153 -0
  30. data/ext/alglib/blas.cpp +576 -0
  31. data/ext/alglib/blas.h +132 -0
  32. data/ext/alglib/cblas.cpp +226 -0
  33. data/ext/alglib/cblas.h +57 -0
  34. data/ext/alglib/cdet.cpp +138 -0
  35. data/ext/alglib/cdet.h +92 -0
  36. data/ext/alglib/chebyshev.cpp +216 -0
  37. data/ext/alglib/chebyshev.h +76 -0
  38. data/ext/alglib/chisquaredistr.cpp +157 -0
  39. data/ext/alglib/chisquaredistr.h +144 -0
  40. data/ext/alglib/cholesky.cpp +285 -0
  41. data/ext/alglib/cholesky.h +86 -0
  42. data/ext/alglib/cinverse.cpp +298 -0
  43. data/ext/alglib/cinverse.h +111 -0
  44. data/ext/alglib/clu.cpp +337 -0
  45. data/ext/alglib/clu.h +120 -0
  46. data/ext/alglib/correlation.cpp +280 -0
  47. data/ext/alglib/correlation.h +77 -0
  48. data/ext/alglib/correlationtests.cpp +726 -0
  49. data/ext/alglib/correlationtests.h +134 -0
  50. data/ext/alglib/crcond.cpp +826 -0
  51. data/ext/alglib/crcond.h +148 -0
  52. data/ext/alglib/creflections.cpp +310 -0
  53. data/ext/alglib/creflections.h +165 -0
  54. data/ext/alglib/csolve.cpp +312 -0
  55. data/ext/alglib/csolve.h +99 -0
  56. data/ext/alglib/ctrinverse.cpp +387 -0
  57. data/ext/alglib/ctrinverse.h +98 -0
  58. data/ext/alglib/ctrlinsolve.cpp +297 -0
  59. data/ext/alglib/ctrlinsolve.h +81 -0
  60. data/ext/alglib/dawson.cpp +234 -0
  61. data/ext/alglib/dawson.h +74 -0
  62. data/ext/alglib/descriptivestatistics.cpp +436 -0
  63. data/ext/alglib/descriptivestatistics.h +112 -0
  64. data/ext/alglib/det.cpp +140 -0
  65. data/ext/alglib/det.h +94 -0
  66. data/ext/alglib/dforest.cpp +1819 -0
  67. data/ext/alglib/dforest.h +316 -0
  68. data/ext/alglib/elliptic.cpp +497 -0
  69. data/ext/alglib/elliptic.h +217 -0
  70. data/ext/alglib/estnorm.cpp +429 -0
  71. data/ext/alglib/estnorm.h +107 -0
  72. data/ext/alglib/expintegrals.cpp +422 -0
  73. data/ext/alglib/expintegrals.h +108 -0
  74. data/ext/alglib/faq.english.html +258 -0
  75. data/ext/alglib/faq.russian.html +272 -0
  76. data/ext/alglib/fdistr.cpp +202 -0
  77. data/ext/alglib/fdistr.h +163 -0
  78. data/ext/alglib/fresnel.cpp +211 -0
  79. data/ext/alglib/fresnel.h +91 -0
  80. data/ext/alglib/gammaf.cpp +338 -0
  81. data/ext/alglib/gammaf.h +104 -0
  82. data/ext/alglib/gqgengauss.cpp +235 -0
  83. data/ext/alglib/gqgengauss.h +92 -0
  84. data/ext/alglib/gqgenhermite.cpp +268 -0
  85. data/ext/alglib/gqgenhermite.h +63 -0
  86. data/ext/alglib/gqgenjacobi.cpp +297 -0
  87. data/ext/alglib/gqgenjacobi.h +72 -0
  88. data/ext/alglib/gqgenlaguerre.cpp +265 -0
  89. data/ext/alglib/gqgenlaguerre.h +69 -0
  90. data/ext/alglib/gqgenlegendre.cpp +300 -0
  91. data/ext/alglib/gqgenlegendre.h +62 -0
  92. data/ext/alglib/gqgenlobatto.cpp +305 -0
  93. data/ext/alglib/gqgenlobatto.h +97 -0
  94. data/ext/alglib/gqgenradau.cpp +232 -0
  95. data/ext/alglib/gqgenradau.h +95 -0
  96. data/ext/alglib/hbisinv.cpp +480 -0
  97. data/ext/alglib/hbisinv.h +183 -0
  98. data/ext/alglib/hblas.cpp +228 -0
  99. data/ext/alglib/hblas.h +64 -0
  100. data/ext/alglib/hcholesky.cpp +339 -0
  101. data/ext/alglib/hcholesky.h +91 -0
  102. data/ext/alglib/hermite.cpp +114 -0
  103. data/ext/alglib/hermite.h +49 -0
  104. data/ext/alglib/hessenberg.cpp +370 -0
  105. data/ext/alglib/hessenberg.h +152 -0
  106. data/ext/alglib/hevd.cpp +247 -0
  107. data/ext/alglib/hevd.h +107 -0
  108. data/ext/alglib/hsschur.cpp +1316 -0
  109. data/ext/alglib/hsschur.h +108 -0
  110. data/ext/alglib/htridiagonal.cpp +734 -0
  111. data/ext/alglib/htridiagonal.h +180 -0
  112. data/ext/alglib/ialglib.cpp +6 -0
  113. data/ext/alglib/ialglib.h +9 -0
  114. data/ext/alglib/ibetaf.cpp +960 -0
  115. data/ext/alglib/ibetaf.h +125 -0
  116. data/ext/alglib/igammaf.cpp +430 -0
  117. data/ext/alglib/igammaf.h +157 -0
  118. data/ext/alglib/inv.cpp +274 -0
  119. data/ext/alglib/inv.h +115 -0
  120. data/ext/alglib/inverseupdate.cpp +480 -0
  121. data/ext/alglib/inverseupdate.h +185 -0
  122. data/ext/alglib/jacobianelliptic.cpp +164 -0
  123. data/ext/alglib/jacobianelliptic.h +94 -0
  124. data/ext/alglib/jarquebera.cpp +2271 -0
  125. data/ext/alglib/jarquebera.h +80 -0
  126. data/ext/alglib/kmeans.cpp +356 -0
  127. data/ext/alglib/kmeans.h +76 -0
  128. data/ext/alglib/laguerre.cpp +94 -0
  129. data/ext/alglib/laguerre.h +48 -0
  130. data/ext/alglib/lbfgs.cpp +1167 -0
  131. data/ext/alglib/lbfgs.h +218 -0
  132. data/ext/alglib/lda.cpp +434 -0
  133. data/ext/alglib/lda.h +133 -0
  134. data/ext/alglib/ldlt.cpp +1130 -0
  135. data/ext/alglib/ldlt.h +124 -0
  136. data/ext/alglib/leastsquares.cpp +1252 -0
  137. data/ext/alglib/leastsquares.h +290 -0
  138. data/ext/alglib/legendre.cpp +107 -0
  139. data/ext/alglib/legendre.h +49 -0
  140. data/ext/alglib/linreg.cpp +1185 -0
  141. data/ext/alglib/linreg.h +380 -0
  142. data/ext/alglib/logit.cpp +1523 -0
  143. data/ext/alglib/logit.h +333 -0
  144. data/ext/alglib/lq.cpp +399 -0
  145. data/ext/alglib/lq.h +160 -0
  146. data/ext/alglib/lu.cpp +462 -0
  147. data/ext/alglib/lu.h +119 -0
  148. data/ext/alglib/mannwhitneyu.cpp +4490 -0
  149. data/ext/alglib/mannwhitneyu.h +115 -0
  150. data/ext/alglib/minlm.cpp +918 -0
  151. data/ext/alglib/minlm.h +312 -0
  152. data/ext/alglib/mlpbase.cpp +3375 -0
  153. data/ext/alglib/mlpbase.h +589 -0
  154. data/ext/alglib/mlpe.cpp +1369 -0
  155. data/ext/alglib/mlpe.h +552 -0
  156. data/ext/alglib/mlptrain.cpp +1056 -0
  157. data/ext/alglib/mlptrain.h +283 -0
  158. data/ext/alglib/nearunityunit.cpp +91 -0
  159. data/ext/alglib/nearunityunit.h +17 -0
  160. data/ext/alglib/normaldistr.cpp +377 -0
  161. data/ext/alglib/normaldistr.h +175 -0
  162. data/ext/alglib/nsevd.cpp +1869 -0
  163. data/ext/alglib/nsevd.h +140 -0
  164. data/ext/alglib/pca.cpp +168 -0
  165. data/ext/alglib/pca.h +87 -0
  166. data/ext/alglib/poissondistr.cpp +143 -0
  167. data/ext/alglib/poissondistr.h +130 -0
  168. data/ext/alglib/polinterpolation.cpp +685 -0
  169. data/ext/alglib/polinterpolation.h +206 -0
  170. data/ext/alglib/psif.cpp +173 -0
  171. data/ext/alglib/psif.h +88 -0
  172. data/ext/alglib/qr.cpp +414 -0
  173. data/ext/alglib/qr.h +168 -0
  174. data/ext/alglib/ratinterpolation.cpp +134 -0
  175. data/ext/alglib/ratinterpolation.h +72 -0
  176. data/ext/alglib/rcond.cpp +705 -0
  177. data/ext/alglib/rcond.h +140 -0
  178. data/ext/alglib/reflections.cpp +504 -0
  179. data/ext/alglib/reflections.h +165 -0
  180. data/ext/alglib/rotations.cpp +473 -0
  181. data/ext/alglib/rotations.h +128 -0
  182. data/ext/alglib/rsolve.cpp +221 -0
  183. data/ext/alglib/rsolve.h +99 -0
  184. data/ext/alglib/sbisinv.cpp +217 -0
  185. data/ext/alglib/sbisinv.h +171 -0
  186. data/ext/alglib/sblas.cpp +185 -0
  187. data/ext/alglib/sblas.h +64 -0
  188. data/ext/alglib/schur.cpp +156 -0
  189. data/ext/alglib/schur.h +102 -0
  190. data/ext/alglib/sdet.cpp +193 -0
  191. data/ext/alglib/sdet.h +101 -0
  192. data/ext/alglib/sevd.cpp +116 -0
  193. data/ext/alglib/sevd.h +99 -0
  194. data/ext/alglib/sinverse.cpp +672 -0
  195. data/ext/alglib/sinverse.h +138 -0
  196. data/ext/alglib/spddet.cpp +138 -0
  197. data/ext/alglib/spddet.h +96 -0
  198. data/ext/alglib/spdgevd.cpp +842 -0
  199. data/ext/alglib/spdgevd.h +200 -0
  200. data/ext/alglib/spdinverse.cpp +509 -0
  201. data/ext/alglib/spdinverse.h +122 -0
  202. data/ext/alglib/spdrcond.cpp +421 -0
  203. data/ext/alglib/spdrcond.h +118 -0
  204. data/ext/alglib/spdsolve.cpp +275 -0
  205. data/ext/alglib/spdsolve.h +105 -0
  206. data/ext/alglib/spline2d.cpp +1192 -0
  207. data/ext/alglib/spline2d.h +301 -0
  208. data/ext/alglib/spline3.cpp +1264 -0
  209. data/ext/alglib/spline3.h +290 -0
  210. data/ext/alglib/srcond.cpp +595 -0
  211. data/ext/alglib/srcond.h +127 -0
  212. data/ext/alglib/ssolve.cpp +895 -0
  213. data/ext/alglib/ssolve.h +139 -0
  214. data/ext/alglib/stdafx.h +0 -0
  215. data/ext/alglib/stest.cpp +131 -0
  216. data/ext/alglib/stest.h +94 -0
  217. data/ext/alglib/studenttdistr.cpp +222 -0
  218. data/ext/alglib/studenttdistr.h +115 -0
  219. data/ext/alglib/studentttests.cpp +377 -0
  220. data/ext/alglib/studentttests.h +178 -0
  221. data/ext/alglib/svd.cpp +620 -0
  222. data/ext/alglib/svd.h +126 -0
  223. data/ext/alglib/tdbisinv.cpp +2608 -0
  224. data/ext/alglib/tdbisinv.h +228 -0
  225. data/ext/alglib/tdevd.cpp +1229 -0
  226. data/ext/alglib/tdevd.h +115 -0
  227. data/ext/alglib/tridiagonal.cpp +594 -0
  228. data/ext/alglib/tridiagonal.h +171 -0
  229. data/ext/alglib/trigintegrals.cpp +490 -0
  230. data/ext/alglib/trigintegrals.h +131 -0
  231. data/ext/alglib/trinverse.cpp +345 -0
  232. data/ext/alglib/trinverse.h +98 -0
  233. data/ext/alglib/trlinsolve.cpp +926 -0
  234. data/ext/alglib/trlinsolve.h +73 -0
  235. data/ext/alglib/tsort.cpp +405 -0
  236. data/ext/alglib/tsort.h +54 -0
  237. data/ext/alglib/variancetests.cpp +245 -0
  238. data/ext/alglib/variancetests.h +134 -0
  239. data/ext/alglib/wsr.cpp +6285 -0
  240. data/ext/alglib/wsr.h +96 -0
  241. data/ext/ap.i +97 -0
  242. data/ext/correlation.i +24 -0
  243. data/ext/extconf.rb +6 -0
  244. data/ext/logit.i +89 -0
  245. data/lib/alglib.rb +71 -0
  246. data/lib/alglib/correlation.rb +26 -0
  247. data/lib/alglib/linearregression.rb +63 -0
  248. data/lib/alglib/logit.rb +42 -0
  249. data/test/test_alglib.rb +52 -0
  250. data/test/test_correlation.rb +44 -0
  251. data/test/test_correlationtest.rb +45 -0
  252. data/test/test_linreg.rb +35 -0
  253. data/test/test_logit.rb +43 -0
  254. data/test/test_pca.rb +27 -0
  255. metadata +326 -0
@@ -0,0 +1,480 @@
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
+ #include <stdafx.h>
34
+ #include "inverseupdate.h"
35
+
36
+ /*************************************************************************
37
+ Inverse matrix update by the Sherman-Morrison formula
38
+
39
+ The algorithm updates matrix A^-1 when adding a number to an element
40
+ of matrix A.
41
+
42
+ Input parameters:
43
+ InvA - inverse of matrix A.
44
+ Array whose indexes range within [0..N-1, 0..N-1].
45
+ N - size of matrix A.
46
+ UpdRow - row where the element to be updated is stored.
47
+ UpdColumn - column where the element to be updated is stored.
48
+ UpdVal - a number to be added to the element.
49
+
50
+
51
+ Output parameters:
52
+ InvA - inverse of modified matrix A.
53
+
54
+ -- ALGLIB --
55
+ Copyright 2005 by Bochkanov Sergey
56
+ *************************************************************************/
57
+ void rmatrixinvupdatesimple(ap::real_2d_array& inva,
58
+ int n,
59
+ int updrow,
60
+ int updcolumn,
61
+ double updval)
62
+ {
63
+ ap::real_1d_array t1;
64
+ ap::real_1d_array t2;
65
+ int i;
66
+ int j;
67
+ double lambda;
68
+ double vt;
69
+
70
+ ap::ap_error::make_assertion(updrow>=0&&updrow<n, "RMatrixInvUpdateSimple: incorrect UpdRow!");
71
+ ap::ap_error::make_assertion(updcolumn>=0&&updcolumn<n, "RMatrixInvUpdateSimple: incorrect UpdColumn!");
72
+ t1.setbounds(0, n-1);
73
+ t2.setbounds(0, n-1);
74
+
75
+ //
76
+ // T1 = InvA * U
77
+ //
78
+ ap::vmove(t1.getvector(0, n-1), inva.getcolumn(updrow, 0, n-1));
79
+
80
+ //
81
+ // T2 = v*InvA
82
+ //
83
+ ap::vmove(&t2(0), &inva(updcolumn, 0), ap::vlen(0,n-1));
84
+
85
+ //
86
+ // Lambda = v * InvA * U
87
+ //
88
+ lambda = updval*inva(updcolumn,updrow);
89
+
90
+ //
91
+ // InvA = InvA - correction
92
+ //
93
+ for(i = 0; i <= n-1; i++)
94
+ {
95
+ vt = updval*t1(i);
96
+ vt = vt/(1+lambda);
97
+ ap::vsub(&inva(i, 0), &t2(0), ap::vlen(0,n-1), vt);
98
+ }
99
+ }
100
+
101
+
102
+ /*************************************************************************
103
+ Inverse matrix update by the Sherman-Morrison formula
104
+
105
+ The algorithm updates matrix A^-1 when adding a vector to a row
106
+ of matrix A.
107
+
108
+ Input parameters:
109
+ InvA - inverse of matrix A.
110
+ Array whose indexes range within [0..N-1, 0..N-1].
111
+ N - size of matrix A.
112
+ UpdRow - the row of A whose vector V was added.
113
+ 0 <= Row <= N-1
114
+ V - the vector to be added to a row.
115
+ Array whose index ranges within [0..N-1].
116
+
117
+ Output parameters:
118
+ InvA - inverse of modified matrix A.
119
+
120
+ -- ALGLIB --
121
+ Copyright 2005 by Bochkanov Sergey
122
+ *************************************************************************/
123
+ void rmatrixinvupdaterow(ap::real_2d_array& inva,
124
+ int n,
125
+ int updrow,
126
+ const ap::real_1d_array& v)
127
+ {
128
+ ap::real_1d_array t1;
129
+ ap::real_1d_array t2;
130
+ int i;
131
+ int j;
132
+ double lambda;
133
+ double vt;
134
+
135
+ t1.setbounds(0, n-1);
136
+ t2.setbounds(0, n-1);
137
+
138
+ //
139
+ // T1 = InvA * U
140
+ //
141
+ ap::vmove(t1.getvector(0, n-1), inva.getcolumn(updrow, 0, n-1));
142
+
143
+ //
144
+ // T2 = v*InvA
145
+ // Lambda = v * InvA * U
146
+ //
147
+ for(j = 0; j <= n-1; j++)
148
+ {
149
+ vt = ap::vdotproduct(v.getvector(0, n-1), inva.getcolumn(j, 0, n-1));
150
+ t2(j) = vt;
151
+ }
152
+ lambda = t2(updrow);
153
+
154
+ //
155
+ // InvA = InvA - correction
156
+ //
157
+ for(i = 0; i <= n-1; i++)
158
+ {
159
+ vt = t1(i)/(1+lambda);
160
+ ap::vsub(&inva(i, 0), &t2(0), ap::vlen(0,n-1), vt);
161
+ }
162
+ }
163
+
164
+
165
+ /*************************************************************************
166
+ Inverse matrix update by the Sherman-Morrison formula
167
+
168
+ The algorithm updates matrix A^-1 when adding a vector to a column
169
+ of matrix A.
170
+
171
+ Input parameters:
172
+ InvA - inverse of matrix A.
173
+ Array whose indexes range within [0..N-1, 0..N-1].
174
+ N - size of matrix A.
175
+ UpdColumn - the column of A whose vector U was added.
176
+ 0 <= UpdColumn <= N-1
177
+ U - the vector to be added to a column.
178
+ Array whose index ranges within [0..N-1].
179
+
180
+ Output parameters:
181
+ InvA - inverse of modified matrix A.
182
+
183
+ -- ALGLIB --
184
+ Copyright 2005 by Bochkanov Sergey
185
+ *************************************************************************/
186
+ void rmatrixinvupdatecolumn(ap::real_2d_array& inva,
187
+ int n,
188
+ int updcolumn,
189
+ const ap::real_1d_array& u)
190
+ {
191
+ ap::real_1d_array t1;
192
+ ap::real_1d_array t2;
193
+ int i;
194
+ int j;
195
+ double lambda;
196
+ double vt;
197
+
198
+ t1.setbounds(0, n-1);
199
+ t2.setbounds(0, n-1);
200
+
201
+ //
202
+ // T1 = InvA * U
203
+ // Lambda = v * InvA * U
204
+ //
205
+ for(i = 0; i <= n-1; i++)
206
+ {
207
+ vt = ap::vdotproduct(&inva(i, 0), &u(0), ap::vlen(0,n-1));
208
+ t1(i) = vt;
209
+ }
210
+ lambda = t1(updcolumn);
211
+
212
+ //
213
+ // T2 = v*InvA
214
+ //
215
+ ap::vmove(&t2(0), &inva(updcolumn, 0), ap::vlen(0,n-1));
216
+
217
+ //
218
+ // InvA = InvA - correction
219
+ //
220
+ for(i = 0; i <= n-1; i++)
221
+ {
222
+ vt = t1(i)/(1+lambda);
223
+ ap::vsub(&inva(i, 0), &t2(0), ap::vlen(0,n-1), vt);
224
+ }
225
+ }
226
+
227
+
228
+ /*************************************************************************
229
+ Inverse matrix update by the Sherman-Morrison formula
230
+
231
+ The algorithm computes the inverse of matrix A+u*v� by using the given matrix
232
+ A^-1 and the vectors u and v.
233
+
234
+ Input parameters:
235
+ InvA - inverse of matrix A.
236
+ Array whose indexes range within [0..N-1, 0..N-1].
237
+ N - size of matrix A.
238
+ U - the vector modifying the matrix.
239
+ Array whose index ranges within [0..N-1].
240
+ V - the vector modifying the matrix.
241
+ Array whose index ranges within [0..N-1].
242
+
243
+ Output parameters:
244
+ InvA - inverse of matrix A + u*v'.
245
+
246
+ -- ALGLIB --
247
+ Copyright 2005 by Bochkanov Sergey
248
+ *************************************************************************/
249
+ void rmatrixinvupdateuv(ap::real_2d_array& inva,
250
+ int n,
251
+ const ap::real_1d_array& u,
252
+ const ap::real_1d_array& v)
253
+ {
254
+ ap::real_1d_array t1;
255
+ ap::real_1d_array t2;
256
+ int i;
257
+ int j;
258
+ double lambda;
259
+ double vt;
260
+
261
+ t1.setbounds(0, n-1);
262
+ t2.setbounds(0, n-1);
263
+
264
+ //
265
+ // T1 = InvA * U
266
+ // Lambda = v * T1
267
+ //
268
+ for(i = 0; i <= n-1; i++)
269
+ {
270
+ vt = ap::vdotproduct(&inva(i, 0), &u(0), ap::vlen(0,n-1));
271
+ t1(i) = vt;
272
+ }
273
+ lambda = ap::vdotproduct(&v(0), &t1(0), ap::vlen(0,n-1));
274
+
275
+ //
276
+ // T2 = v*InvA
277
+ //
278
+ for(j = 0; j <= n-1; j++)
279
+ {
280
+ vt = ap::vdotproduct(v.getvector(0, n-1), inva.getcolumn(j, 0, n-1));
281
+ t2(j) = vt;
282
+ }
283
+
284
+ //
285
+ // InvA = InvA - correction
286
+ //
287
+ for(i = 0; i <= n-1; i++)
288
+ {
289
+ vt = t1(i)/(1+lambda);
290
+ ap::vsub(&inva(i, 0), &t2(0), ap::vlen(0,n-1), vt);
291
+ }
292
+ }
293
+
294
+
295
+ /*************************************************************************
296
+ Obsolete 1-based subroutine
297
+ *************************************************************************/
298
+ void shermanmorrisonsimpleupdate(ap::real_2d_array& inva,
299
+ int n,
300
+ int updrow,
301
+ int updcolumn,
302
+ double updval)
303
+ {
304
+ ap::real_1d_array t1;
305
+ ap::real_1d_array t2;
306
+ int i;
307
+ int j;
308
+ double lambda;
309
+ double vt;
310
+
311
+ t1.setbounds(1, n);
312
+ t2.setbounds(1, n);
313
+
314
+ //
315
+ // T1 = InvA * U
316
+ //
317
+ ap::vmove(t1.getvector(1, n), inva.getcolumn(updrow, 1, n));
318
+
319
+ //
320
+ // T2 = v*InvA
321
+ //
322
+ ap::vmove(&t2(1), &inva(updcolumn, 1), ap::vlen(1,n));
323
+
324
+ //
325
+ // Lambda = v * InvA * U
326
+ //
327
+ lambda = updval*inva(updcolumn,updrow);
328
+
329
+ //
330
+ // InvA = InvA - correction
331
+ //
332
+ for(i = 1; i <= n; i++)
333
+ {
334
+ vt = updval*t1(i);
335
+ vt = vt/(1+lambda);
336
+ ap::vsub(&inva(i, 1), &t2(1), ap::vlen(1,n), vt);
337
+ }
338
+ }
339
+
340
+
341
+ /*************************************************************************
342
+ Obsolete 1-based subroutine
343
+ *************************************************************************/
344
+ void shermanmorrisonupdaterow(ap::real_2d_array& inva,
345
+ int n,
346
+ int updrow,
347
+ const ap::real_1d_array& v)
348
+ {
349
+ ap::real_1d_array t1;
350
+ ap::real_1d_array t2;
351
+ int i;
352
+ int j;
353
+ double lambda;
354
+ double vt;
355
+
356
+ t1.setbounds(1, n);
357
+ t2.setbounds(1, n);
358
+
359
+ //
360
+ // T1 = InvA * U
361
+ //
362
+ ap::vmove(t1.getvector(1, n), inva.getcolumn(updrow, 1, n));
363
+
364
+ //
365
+ // T2 = v*InvA
366
+ // Lambda = v * InvA * U
367
+ //
368
+ for(j = 1; j <= n; j++)
369
+ {
370
+ vt = ap::vdotproduct(v.getvector(1, n), inva.getcolumn(j, 1, n));
371
+ t2(j) = vt;
372
+ }
373
+ lambda = t2(updrow);
374
+
375
+ //
376
+ // InvA = InvA - correction
377
+ //
378
+ for(i = 1; i <= n; i++)
379
+ {
380
+ vt = t1(i)/(1+lambda);
381
+ ap::vsub(&inva(i, 1), &t2(1), ap::vlen(1,n), vt);
382
+ }
383
+ }
384
+
385
+
386
+ /*************************************************************************
387
+ Obsolete 1-based subroutine
388
+ *************************************************************************/
389
+ void shermanmorrisonupdatecolumn(ap::real_2d_array& inva,
390
+ int n,
391
+ int updcolumn,
392
+ const ap::real_1d_array& u)
393
+ {
394
+ ap::real_1d_array t1;
395
+ ap::real_1d_array t2;
396
+ int i;
397
+ int j;
398
+ double lambda;
399
+ double vt;
400
+
401
+ t1.setbounds(1, n);
402
+ t2.setbounds(1, n);
403
+
404
+ //
405
+ // T1 = InvA * U
406
+ // Lambda = v * InvA * U
407
+ //
408
+ for(i = 1; i <= n; i++)
409
+ {
410
+ vt = ap::vdotproduct(&inva(i, 1), &u(1), ap::vlen(1,n));
411
+ t1(i) = vt;
412
+ }
413
+ lambda = t1(updcolumn);
414
+
415
+ //
416
+ // T2 = v*InvA
417
+ //
418
+ ap::vmove(&t2(1), &inva(updcolumn, 1), ap::vlen(1,n));
419
+
420
+ //
421
+ // InvA = InvA - correction
422
+ //
423
+ for(i = 1; i <= n; i++)
424
+ {
425
+ vt = t1(i)/(1+lambda);
426
+ ap::vsub(&inva(i, 1), &t2(1), ap::vlen(1,n), vt);
427
+ }
428
+ }
429
+
430
+
431
+ /*************************************************************************
432
+ Obsolete 1-based subroutine
433
+ *************************************************************************/
434
+ void shermanmorrisonupdateuv(ap::real_2d_array& inva,
435
+ int n,
436
+ const ap::real_1d_array& u,
437
+ const ap::real_1d_array& v)
438
+ {
439
+ ap::real_1d_array t1;
440
+ ap::real_1d_array t2;
441
+ int i;
442
+ int j;
443
+ double lambda;
444
+ double vt;
445
+
446
+ t1.setbounds(1, n);
447
+ t2.setbounds(1, n);
448
+
449
+ //
450
+ // T1 = InvA * U
451
+ // Lambda = v * T1
452
+ //
453
+ for(i = 1; i <= n; i++)
454
+ {
455
+ vt = ap::vdotproduct(&inva(i, 1), &u(1), ap::vlen(1,n));
456
+ t1(i) = vt;
457
+ }
458
+ lambda = ap::vdotproduct(&v(1), &t1(1), ap::vlen(1,n));
459
+
460
+ //
461
+ // T2 = v*InvA
462
+ //
463
+ for(j = 1; j <= n; j++)
464
+ {
465
+ vt = ap::vdotproduct(v.getvector(1, n), inva.getcolumn(j, 1, n));
466
+ t2(j) = vt;
467
+ }
468
+
469
+ //
470
+ // InvA = InvA - correction
471
+ //
472
+ for(i = 1; i <= n; i++)
473
+ {
474
+ vt = t1(i)/(1+lambda);
475
+ ap::vsub(&inva(i, 1), &t2(1), ap::vlen(1,n), vt);
476
+ }
477
+ }
478
+
479
+
480
+