svd.c 5.5 KB

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