96#include <malloc/malloc.h>
102#define MIN(A,B) (((A)<(B)) ? (A):(B))
103#define MAX(A,B) (((A)>(B)) ? (A):(B))
104#define ALLOC2D(m,n) (REAL *) malloc((unsigned)(m)*(n)*sizeof(REAL))
105#define ALLOC1D(n) (REAL *) malloc((unsigned)(n)*sizeof(REAL))
106#define FREE(p) free((char*)(p))
107#define CLEAR2D(a,m,n) (void) memset((char*)(a),0,(m)*(n)*sizeof(REAL))
108#define COPY2D(d,m,n,s) (void) memcpy((char*)(d),(char*)(s),(int)((m)*(n)*sizeof(REAL)))
109#define REF2D(a,m,n,i,j) (a[(n)*(i)+(j)])
114 return ((REAL) sqrt (a*a +
b*
b));
146 for (scale=0, k=i; k<m; k++) scale += ((REAL) fabs(
REF2D(a,m,n,k,j)));
152 for (k=i; k<m; k++) hv[k] =
REF2D(a,m,n,k,j) / scale;
153 for (sigma=0, k=i; k<m; k++) sigma += hv[k]*hv[k];
160 snorm = ((REAL) ((f > 0) ? -sqrt(sigma) : sqrt(sigma)));
167 REF2D(a,m,n,i,j) = scale * snorm;
168 for (k=i+1; k<m; k++)
REF2D(a,m,n,k,j) = 0;
175 for (k=j+1; k<n; k++) {
176 for (dot=0, l=i; l<m; l++) dot +=
REF2D(a,m,n,l,k)*hv[l];
178 for (l=i; l<m; l++)
REF2D(a,m,n,l,k) += s*hv[l];
185 for (k=0; k<m; k++) {
186 for (dot=0, l=i; l<m; l++) dot +=
REF2D(u,m,m,k,l)*hv[l];
188 for (l=i; l<m; l++)
REF2D(u,m,m,k,l) += s*hv[l];
199 REAL scale, sigma,snorm, f, h, s, dot;
202 for (scale=0, k=j; k<n; k++) scale += ((REAL) fabs(
REF2D(a,m,n,i,k)));
205 for (k=j; k<n; k++) hv[k] =
REF2D(a,m,n,i,k) / scale;
206 for (sigma=0, k=j; k<n; k++) sigma += hv[k]*hv[k];
209 snorm = ((REAL) ((f > 0) ? -sqrt(sigma) : sqrt(sigma)));
213 REF2D(a,m,n,i,j) = scale * snorm;
214 for (k=j+1; k<n; k++)
REF2D(a,m,n,i,k) = 0;
216 for (k=i+1; k<m; k++) {
217 for (dot=0, l=j; l<n; l++) dot +=
REF2D(a,m,n,k,l)*hv[l];
219 for (l=j; l<n; l++)
REF2D(a,m,n,k,l) += s*hv[l];
222 for (k=0; k<n; k++) {
223 for (dot=0, l=j; l<n; l++) dot +=
REF2D(v,n,n,l,k)*hv[l];
225 for (l=j; l<n; l++)
REF2D(v,n,n,l,k) += s*hv[l];
234void rotate_cols(
int i,
int j,REAL cos,REAL sin,REAL* a,
int start,
int n,
int mm,
int nn)
236 int end = start+n, k;
238 for (k=start; k<end; k++) {
239 x =
REF2D(a,mm,nn,k,i);
240 y =
REF2D(a,mm,nn,k,j);
241 REF2D(a,mm,nn,k,i) = cos*x + sin*y;
242 REF2D(a,mm,nn,k,j) = -sin*x + cos*y;
234void rotate_cols(
int i,
int j,REAL cos,REAL sin,REAL* a,
int start,
int n,
int mm,
int nn) {
…}
252void rotate_rows(
int i,
int j, REAL cos,REAL sin,REAL* a,
int start,
int n,
int mm,
int nn)
254 int end = start+n, k;
256 for (k=start; k<end; k++) {
257 x =
REF2D(a,mm,nn,i,k);
258 y =
REF2D(a,mm,nn,j,k);
259 REF2D(a,mm,nn,i,k) = cos*x + sin*y;
260 REF2D(a,mm,nn,j,k) = -sin*x + cos*y;
252void rotate_rows(
int i,
int j, REAL cos,REAL sin,REAL* a,
int start,
int n,
int mm,
int nn) {
…}
289 REAL r, x, hypot, cos, sin;
291 for (i=p+1; i<=z; i++) {
295 hypot = ((REAL) sqrt (r*r + x*x));
334 REAL r, x, hypot, cos, sin;
336 for (i=z-1; i>=p; i--) {
340 hypot = ((REAL) sqrt (r*r + x*x));
388 REAL x, r, hypot, cos, sin;
415 REF2D(
b,m,n,i,i+1) = hypot;
480 fm = (q-2) < 0 ? 0 :
REF2D(
b,m,n,q-2,q-1);
485 t11 = dm*dm + fm * fm;
486 t12 = dm * fn; t22 = dn * dn + fn * fn;
509 d = ((REAL) 0.5)*(t11 - t22);
511 uu = t22 + d + ((d > 0) ? -s : s);
557 int i,j, min=
MIN(m,n);
558 REAL *usave = u, *vsave = v, *h =
ALLOC1D(
MAX(m,n));
561 if (min != m) u =
ALLOC2D(m,m);
562 if (min != n) v =
ALLOC2D(n,n);
567 for (i=0; i<m; i++)
REF2D(u,m,m,i,i) = 1;
568 for (i=0; i<n; i++)
REF2D(v,n,n,i,i) = 1;
572 for (i = 0; i<min; i++) {
587 for (i=0; i<m; i++)
for (j=0; j<min; j++)
592 for (i=0; i<n; i++)
for (j=0; j<min; j++)
619 int p, q, i, j, z, iter, min=
MIN(m,n);
629 for (anorm =
REF2D(
b,m,n,0,0), i=1 ; i < min ; i++)
631 t = ((REAL) (fabs(
REF2D(
b,m,n,i,i)) + fabs(
REF2D(
b,m,n,i-1,i))));
640 for (q = min-1; q>=0; q--) {
646 for (iter=0; iter<30; iter++) {
656 for (p = q; p>0; p--)
if (
REF2D(
b,m,n,p-1,p) + anorm == anorm) {
669 if (
REF2D(
b,m,n,q,q) < 0) {
671 for (j=0; j<n; j++)
REF2D(v,min,n,q,j) *= -1;
677 for (z= -1, i=q; i>=p; i--)
if (
REF2D(
b,m,n,i,i)+anorm==anorm) {
728void num_svd(
const REAL *a,
int m,
int n,REAL *u,REAL *w,REAL *vt)
730 int i, j, k, min =
MIN(m,n);
738 for (i=0; i<min; i++) w[i] =
REF2D(g,m,n,i,i);
744 for (i=1; i<min; i++) {
749 for (k=0; k<m; k++) *p++ =
REF2D(u,m,min,k,i);
750 for (k=0; k<n; k++) *p++ =
REF2D(vt,min,n,i,k);
752 for (j=i; j>0 && wi > w[j-1]; j--) {
754 for (k=0; k<m; k++)
REF2D(u,m,min,k,j)=
REF2D(u,m,min,k,j-1);
755 for (k=0; k<n; k++)
REF2D(vt,min,n,j,k)=
REF2D(vt,min,n,j-1,k);
760 for (k=0; k<m; k++)
REF2D(u,m,min,k,j) = *p++;
761 for (k=0; k<n; k++)
REF2D(vt,min,n,j,k) = *p++;
728void num_svd(
const REAL *a,
int m,
int n,REAL *u,REAL *w,REAL *vt) {
…}
792 const REAL
b[], REAL x[], REAL eps)
794 const int min =
MIN(m,n);
795 const REAL thresh = eps * w[0];
799 for (j=0; j<min; j++) {
801 if (w[j] >= thresh) {
802 for (i=0; i<m; i++) s +=
REF2D(u,m,min,i,j) *
b[i];
807 for (k=0; k<n; k++) {
809 for (j=0; j<min; j++) s +=
REF2D(vt,min,n,j,k) * tmp[j];
#define FREE(p)
Definition SVD.inl:106
void bidiagonal_svd(REAL *b, int m, int n, REAL *u, REAL *v)
Definition SVD.inl:616
void bidiagonalize(const REAL *a, int m, int n, REAL *u, REAL *b, REAL *v)
Definition SVD.inl:555
#define ALLOC2D(m, n)
Definition SVD.inl:104
void num_svd(const REAL *a, int m, int n, REAL *u, REAL *w, REAL *vt)
Definition SVD.inl:728
void golub_kahn_svd_rot(REAL *b, int p, int q, REAL *v, int m, int n, int min)
Definition SVD.inl:470
void rotate_cols(int i, int j, REAL cos, REAL sin, REAL *a, int start, int n, int mm, int nn)
Definition SVD.inl:234
REAL fhypot(REAL a, REAL b)
Definition SVD.inl:112
#define ALLOC1D(n)
Definition SVD.inl:105
void clr_top_subdiag_elt(REAL *b, int p, int z, REAL *u, REAL *v, int m, int n, int min)
Definition SVD.inl:385
#define CLEAR2D(a, m, n)
Definition SVD.inl:107
#define COPY2D(d, m, n, s)
Definition SVD.inl:108
void clr_top_supdiag_elt(REAL *b, int p, int z, REAL *u, int m, int n, int min)
Definition SVD.inl:286
void householder_zero_row(REAL *a, REAL *v, int i, int j, int m, int n, REAL *hv)
Definition SVD.inl:197
void num_svd_backsubst(int m, int n, const REAL *u, const REAL *w, const REAL *vt, const REAL b[], REAL x[], REAL eps)
Definition SVD.inl:791
#define REF2D(a, m, n, i, j)
Definition SVD.inl:109
void householder_zero_col(REAL *a, REAL *u, int i, int j, int m, int n, REAL *hv)
Definition SVD.inl:136
#define MAX(A, B)
Definition SVD.inl:103
#define MIN(A, B)
Definition SVD.inl:102
void rotate_rows(int i, int j, REAL cos, REAL sin, REAL *a, int start, int n, int mm, int nn)
Definition SVD.inl:252
void clr_bot_supdiag_elt(REAL *b, int p, int z, REAL *v, int m, int n, int min)
Definition SVD.inl:331
long b
Definition jpegint.h:371