GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
sv2val.c
Go to the documentation of this file.
00001 /*  sv2val.c    CCMATH mathematics library source code.
00002  *
00003  *  Copyright (C)  2000   Daniel A. Atkinson    All rights reserved.
00004  *  This code may be redistributed under the terms of the GNU library
00005  *  public license (LGPL). ( See the lgpl.license file for details.)
00006  * ------------------------------------------------------------------------
00007  */
00008 #include <stdlib.h>
00009 #include "ccmath.h"
00010 int sv2val(double *d, double *a, int m, int n)
00011 {
00012     double *p, *p1, *q, *w, *v;
00013 
00014     double s, h, u;
00015 
00016     int i, j, k, mm, nm, ms;
00017 
00018     if (m < n)
00019         return -1;
00020     w = (double *)calloc(m, sizeof(double));
00021     for (i = 0, mm = m, p = a; i < n && mm > 1; ++i, --mm, p += n + 1) {
00022         for (j = 0, q = p, s = 0.; j < mm; ++j, q += n) {
00023             w[j] = *q;
00024             s += *q * *q;
00025         }
00026         if (s > 0.) {
00027             h = sqrt(s);
00028             if (*p < 0.)
00029                 h = -h;
00030             s += *p * h;
00031             s = 1. / s;
00032             w[0] += h;
00033             for (k = 1, ms = n - i; k < ms; ++k) {
00034                 for (j = 0, q = p + k, u = 0.; j < mm; q += n)
00035                     u += w[j++] * *q;
00036                 u = u * s;
00037                 for (j = 0, q = p + k; j < mm; q += n)
00038                     *q -= u * w[j++];
00039             }
00040             *p = -h;
00041         }
00042     }
00043     for (i = 0, p = a; i < n; ++i, p += n) {
00044         for (j = 0, q = p; j < i; ++j)
00045             *q++ = 0.;
00046     }
00047     for (i = 0, mm = n, nm = n - 1, p = a; i < n; ++i, --mm, --nm, p += n + 1) {
00048         if (i && mm > 1) {
00049             for (j = 0, q = p, s = 0.; j < mm; ++j, q += n) {
00050                 w[j] = *q;
00051                 s += *q * *q;
00052             }
00053             if (s > 0.) {
00054                 h = sqrt(s);
00055                 if (*p < 0.)
00056                     h = -h;
00057                 s += *p * h;
00058                 s = 1. / s;
00059                 w[0] += h;
00060                 for (k = 1, ms = n - i; k < ms; ++k) {
00061                     for (j = 0, q = p + k, u = 0.; j < mm; q += n)
00062                         u += w[j++] * *q;
00063                     u *= s;
00064                     for (j = 0, q = p + k; j < mm; q += n)
00065                         *q -= u * w[j++];
00066                 }
00067                 *p = -h;
00068             }
00069         }
00070         p1 = p + 1;
00071         if (nm > 1) {
00072             for (j = 0, q = p1, s = 0.; j < nm; ++j, ++q)
00073                 s += *q * *q;
00074             if (s > 0.) {
00075                 h = sqrt(s);
00076                 if (*p1 < 0.)
00077                     h = -h;
00078                 s += *p1 * h;
00079                 s = 1. / s;
00080                 *p1 += h;
00081                 for (k = n, ms = n * (m - i); k < ms; k += n) {
00082                     for (j = 0, q = p1, v = p1 + k, u = 0.; j < nm; ++j)
00083                         u += *q++ * *v++;
00084                     u *= s;
00085                     for (j = 0, q = p1, v = p1 + k; j < nm; ++j)
00086                         *v++ -= u * *q++;
00087                 }
00088                 *p1 = -h;
00089             }
00090         }
00091     }
00092     for (j = 0, p = a; j < n; ++j, p += n + 1) {
00093         d[j] = *p;
00094         if (j < n - 1)
00095             w[j] = *(p + 1);
00096         else
00097             w[j] = 0.;
00098     }
00099     qrbdi(d, w, n);
00100     for (i = 0; i < n; ++i)
00101         if (d[i] < 0.)
00102             d[i] = -d[i];
00103     free(w);
00104     return 0;
00105 }