svd.c 6.8 KB

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