void mmul(double *c,double *a,double *b,int n) { double *p,*q,s; int i,j,k; trnm(b,n); for(i=0; i<n ; ++i,a+=n) { for(j=0,q=b; j<n ; ++j) { for(k=0,p=a,s=0.; k<n ; ++k) s+= *p++ * *q++; *c++ =s; } } trnm(b,n); }
static void do_stuff(void) { //int m = 7; int m = 3; int n = 3; double a[n*m], d[n], u[m*m], v[n*n], dmat[n*m]; // build and print a matrix of random numbers FORI(n*m) a[i] = randombounds(10, 99); PMATRIX(a, m, n); // compute the SVD int r = svd(d, a, u, m, v, n); // show the results FORI(n*m) dmat[i] = 0; FORI(n) dmat[n*i+i] = d[i]; PMATRIX(dmat, m, n); PMATRIX(u, m, m); PMATRIX(v, n, n); // check the reconstruction double ud[m*n], udv[m*n]; rmmult(ud, u, dmat, m, m, n); trnm(v,n); rmmult(udv, ud, v, m, n, n); PMATRIX(udv, m, n); }
void eigen(double *a,double *ev,int n) { double *dp; dp=(double *)calloc(n,sizeof(double)); housev(a,ev,dp,n); qrevec(ev,a,dp,n); trnm(a,n); free(dp); }