svd.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/gmath.h>
  4. static double at, bt, ct;
  5. #define PYTHAG(a,b) ((at=fabs(a)) > (bt=fabs(b)) ? \
  6. (ct=bt/at,at*sqrt(1.0+ct*ct)) : (bt ? (ct=at/bt,bt*sqrt(1.0+ct*ct)): 0.0))
  7. static double maxarg1, maxarg2;
  8. #define MAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\
  9. (maxarg1) : (maxarg2))
  10. #define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))
  11. int G_svdcmp(double **a, int m, int n, double *w, double **v)
  12. {
  13. int flag, i, its, j, jj, k, ii = 0, nm = 0;
  14. double c, f, h, s, x, y, z;
  15. double anorm = 0.0, g = 0.0, scale = 0.0;
  16. double *rv1, *G_alloc_vector();
  17. if (m < n)
  18. return -1; /* must augment A with extra zero rows */
  19. rv1 = G_alloc_vector(n);
  20. n--;
  21. m--;
  22. for (i = 0; i <= n; i++) {
  23. ii = i + 1;
  24. rv1[i] = scale * g;
  25. g = s = scale = 0.0;
  26. if (i <= m) {
  27. for (k = i; k <= m; k++)
  28. scale += fabs(a[k][i]);
  29. if (scale) {
  30. for (k = i; k <= m; k++) {
  31. a[k][i] /= scale;
  32. s += a[k][i] * a[k][i];
  33. }
  34. f = a[i][i];
  35. g = -SIGN(sqrt(s), f);
  36. h = f * g - s;
  37. a[i][i] = f - g;
  38. if (i != n) {
  39. for (j = ii; j <= n; j++) {
  40. for (s = 0.0, k = i; k <= m; k++)
  41. s += a[k][i] * a[k][j];
  42. f = s / h;
  43. for (k = i; k <= m; k++)
  44. a[k][j] += f * a[k][i];
  45. }
  46. }
  47. for (k = i; k <= m; k++)
  48. a[k][i] *= scale;
  49. }
  50. }
  51. w[i] = scale * g;
  52. g = s = scale = 0.0;
  53. if (i <= m && i != n) {
  54. for (k = ii; k <= n; k++)
  55. scale += fabs(a[i][k]);
  56. if (scale) {
  57. for (k = ii; k <= n; k++) {
  58. a[i][k] /= scale;
  59. s += a[i][k] * a[i][k];
  60. }
  61. f = a[i][ii];
  62. g = -SIGN(sqrt(s), f);
  63. h = f * g - s;
  64. a[i][ii] = f - g;
  65. for (k = ii; k <= n; k++)
  66. rv1[k] = a[i][k] / h;
  67. if (i != m) {
  68. for (j = ii; j <= m; j++) {
  69. for (s = 0.0, k = ii; k <= n; k++)
  70. s += a[j][k] * a[i][k];
  71. for (k = ii; k <= n; k++)
  72. a[j][k] += s * rv1[k];
  73. }
  74. }
  75. for (k = ii; k <= n; k++)
  76. a[i][k] *= scale;
  77. }
  78. }
  79. anorm = MAX(anorm, (fabs(w[i]) + fabs(rv1[i])));
  80. }
  81. for (i = n; i >= 0; i--) {
  82. if (i < n) {
  83. if (g) {
  84. for (j = ii; j <= n; j++)
  85. v[j][i] = (a[i][j] / a[i][ii]) / g;
  86. for (j = ii; j <= n; j++) {
  87. for (s = 0.0, k = ii; k <= n; k++)
  88. s += a[i][k] * v[k][j];
  89. for (k = ii; k <= n; k++)
  90. v[k][j] += s * v[k][i];
  91. }
  92. }
  93. for (j = ii; j <= n; j++)
  94. v[i][j] = v[j][i] = 0.0;
  95. }
  96. v[i][i] = 1.0;
  97. g = rv1[i];
  98. ii = i;
  99. }
  100. for (i = n; i >= 0; i--) {
  101. ii = i + 1;
  102. g = w[i];
  103. if (i < n)
  104. for (j = ii; j <= n; j++)
  105. a[i][j] = 0.0;
  106. if (g) {
  107. g = 1.0 / g;
  108. if (i != n) {
  109. for (j = ii; j <= n; j++) {
  110. for (s = 0.0, k = ii; k <= m; k++)
  111. s += a[k][i] * a[k][j];
  112. f = (s / a[i][i]) * g;
  113. for (k = i; k <= m; k++)
  114. a[k][j] += f * a[k][i];
  115. }
  116. }
  117. for (j = i; j <= m; j++)
  118. a[j][i] *= g;
  119. }
  120. else {
  121. for (j = i; j <= m; j++)
  122. a[j][i] = 0.0;
  123. }
  124. ++a[i][i];
  125. }
  126. for (k = n; k >= 0; k--) {
  127. for (its = 1; its <= 30; its++) {
  128. flag = 1;
  129. for (ii = k; ii >= 0; ii--) {
  130. nm = ii - 1;
  131. if (fabs(rv1[ii]) + anorm == anorm) {
  132. flag = 0;
  133. break;
  134. }
  135. if (fabs(w[nm]) + anorm == anorm)
  136. break;
  137. }
  138. if (flag) {
  139. c = 0.0;
  140. s = 1.0;
  141. for (i = ii; i <= k; i++) {
  142. f = s * rv1[i];
  143. if (fabs(f) + anorm != anorm) {
  144. g = w[i];
  145. h = PYTHAG(f, g);
  146. w[i] = h;
  147. h = 1.0 / h;
  148. c = g * h;
  149. s = (-f * h);
  150. for (j = 0; j <= m; j++) {
  151. y = a[j][nm];
  152. z = a[j][i];
  153. a[j][nm] = y * c + z * s;
  154. a[j][i] = z * c - y * s;
  155. }
  156. }
  157. }
  158. }
  159. z = w[k];
  160. if (ii == k) {
  161. if (z < 0.0) {
  162. w[k] = -z;
  163. for (j = 0; j <= n; j++)
  164. v[j][k] = (-v[j][k]);
  165. }
  166. break;
  167. }
  168. if (its == 30)
  169. return -2; /*No convergence in 30 SVDCMP iterations */
  170. x = w[ii];
  171. nm = k - 1;
  172. y = w[nm];
  173. g = rv1[nm];
  174. h = rv1[k];
  175. f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y);
  176. g = PYTHAG(f, 1.0);
  177. f = ((x - z) * (x + z) + h * ((y / (f + SIGN(g, f))) - h)) / x;
  178. c = s = 1.0;
  179. for (j = ii; j <= nm; j++) {
  180. i = j + 1;
  181. g = rv1[i];
  182. y = w[i];
  183. h = s * g;
  184. g = c * g;
  185. z = PYTHAG(f, h);
  186. rv1[j] = z;
  187. c = f / z;
  188. s = h / z;
  189. f = x * c + g * s;
  190. g = g * c - x * s;
  191. h = y * s;
  192. y = y * c;
  193. for (jj = 0; jj <= n; jj++) {
  194. x = v[jj][j];
  195. z = v[jj][i];
  196. v[jj][j] = x * c + z * s;
  197. v[jj][i] = z * c - x * s;
  198. }
  199. z = PYTHAG(f, h);
  200. w[j] = z;
  201. if (z) {
  202. z = 1.0 / z;
  203. c = f * z;
  204. s = h * z;
  205. }
  206. f = (c * g) + (s * y);
  207. x = (c * y) - (s * g);
  208. for (jj = 0; jj <= m; jj++) {
  209. y = a[jj][j];
  210. z = a[jj][i];
  211. a[jj][j] = y * c + z * s;
  212. a[jj][i] = z * c - y * s;
  213. }
  214. }
  215. rv1[ii] = 0.0;
  216. rv1[k] = f;
  217. w[k] = x;
  218. }
  219. }
  220. G_free_vector(rv1);
  221. return 0;
  222. }
  223. #undef SIGN
  224. #undef MAX
  225. #undef PYTHAG
  226. int G_svbksb(double **u, double w[], double **v,
  227. int m, int n, double b[], double x[])
  228. {
  229. int j, i;
  230. double s, *tmp, *G_alloc_vector();
  231. tmp = G_alloc_vector(n);
  232. for (j = 0; j < n; j++) {
  233. s = 0.0;
  234. if (w[j]) {
  235. for (i = 0; i < m; i++)
  236. s += u[i][j] * b[i];
  237. s /= w[j];
  238. }
  239. tmp[j] = s;
  240. }
  241. for (j = 0; j < n; j++) {
  242. s = 0.0;
  243. for (i = 0; i < n; i++)
  244. s += v[j][i] * tmp[i];
  245. x[j] = s;
  246. }
  247. G_free_vector(tmp);
  248. return 0;
  249. }
  250. #define TOL 1e-8
  251. int G_svelim(double *w, int n)
  252. {
  253. int i;
  254. double thresh;
  255. thresh = 0.0; /* remove singularity */
  256. for (i = 0; i < n; i++)
  257. if (w[i] > thresh)
  258. thresh = w[i];
  259. thresh *= TOL;
  260. for (i = 0; i < n; i++)
  261. if (w[i] < thresh)
  262. w[i] = 0.0;
  263. return 0;
  264. }
  265. #undef TOL