static void difference_of_gaussian(struct fmat_t *fm) { /* this kernel was generated by the gen-gaussian-kernel.py script */ #define KERNEL_A_SIZE 7 #define KERNEL_B_SIZE 13 /* sigma = 1.0 */ static const float kernel_a[] = { 0.00443f, 0.05401f, 0.24204f, 0.39905f, 0.24204f, 0.05401f, 0.00443f, }; /* sigma = 2.0 */ static const float kernel_b[] = { 0.00222f, 0.00877f, 0.02702f, 0.06482f, 0.12111f, 0.17621f, 0.19968f, 0.17621f, 0.12111f, 0.06482f, 0.02702f, 0.00877f, 0.00222f, }; /* gaussian smoothing */ struct fmat_t *fma = fmat_new(fm->w, fm->h); struct fmat_t *fmb = fmat_new(fm->w, fm->h); seperate_conv(fm, kernel_a, KERNEL_A_SIZE, fma); seperate_conv(fm, kernel_b, KERNEL_B_SIZE, fmb); fmat_sub(fma, fmb, fm); fmat_free(&fma); fmat_free(&fmb); }
void inorm(const struct image_t *src, struct image_t *dst) { struct fmat_t *fm = fmat_new(src->w, src->h); struct fmat_t *tfm = fmat_new(src->w, src->h); struct image_t *timg = image_new(src->w, src->h); gamma_correction(src, fm); difference_of_gaussian(fm); tanh_smooth(fm, tfm); rescale_to_image(tfm, dst); image_free(&timg); fmat_free(&fm); fmat_free(&tfm); }
float *fmat_new_pca_part(int d,int n,int nev, const float *v,float *singvals) { if(!(nev<=d && nev<=n)) { fprintf(stderr,"fmat_new_pca_part: asking for too many eigenvalues (%d) wrt %d*%d data\n",nev,n,d); return NULL; } float *pcamat=fmat_new(d,nev); int ret; if(n>=d) { ret=fmat_svd_partial_full(d,n,nev,v,0,singvals,pcamat,NULL,count_cpu()); } else { fprintf(stderr,"fmat_new_pca_part: warn fewer learning points (%d) than dimensions (%d): transposing\n",n,d); ret=fmat_svd_partial_full(n,d,nev,v,1,singvals,NULL,pcamat,count_cpu()); } if(ret<0) { free(pcamat); pcamat=NULL; } return pcamat; }
static void seperate_conv(const struct fmat_t *fm, const float kernel[], unsigned int kernel_size, struct fmat_t *dst) { struct fmat_t *buf = fmat_new(fm->w, fm->h); sep_conv_h(fm->data, fm->w, fm->h, kernel, kernel_size, buf->data); sep_conv_v(buf->data, buf->w, buf->h, kernel, kernel_size, dst->data); fmat_free(&buf); }
float *fmat_new_get_columns (const float *a, int nrow, int ncolout, const int *cols) { int i,j; float *b = fmat_new (nrow, ncolout); for(j=0;j<ncolout;j++) for(i=0;i<nrow;i++) b[j*nrow+i]=a[i+nrow*cols[j]]; return b; }
float* fmat_new_mul_full(const float *left, const float *right, int m, int n, int k, const char *transp) { float *result=fmat_new(m,n); fmat_mul_full(left, right, m, n, k, transp, result); return result; }
/*---------------------------------------------------------------------------*/ float *fmat_new_rand_gauss (int nrow, int ncol) { long i; float *m = fmat_new (nrow, ncol); for (i = 0; i < nrow * ncol; i++) m[i] = gaussrand (); return m; }
float *fmat_get_submatrix (const float *a, int nrow, int nrow_out, int ncol) { long i; float *b=fmat_new(nrow_out,ncol); for(i=0;i<ncol;i++) memcpy(b+i*nrow_out,a+i*nrow,nrow_out*sizeof(*a)); return b; }
float *fmat_new_get_rows (const float *a, int d, int n, int nrowout, const int *rows) { float *b=fmat_new(nrowout,n); int i,j; int ii=0; for(j=0;j<n;j++) for(i=0;i<nrowout;i++) b[ii++]=a[rows[i]+d*j]; return b; }
float *fmat_new_get_rows (const float *a, int d, int n, int nrowout, const int *rows) { float *b=fmat_new(nrowout,n); long i, j; long ii=0; for(j=0;j<n;j++) { const float *aj = a + d*(long)j; for(i=0;i<nrowout;i++) b[ii++]=aj[rows[i]]; } return b; }
float *fmat_new_vstack(const float *a,int da, const float *b,int db, int n) { int i; float *c=fmat_new(da+db,n),*ret=c; for(i=0;i<n;i++) { memcpy(c,a,da*sizeof(float)); c+=da; a+=da; memcpy(c,b,db*sizeof(float)); c+=db; b+=db; } return ret; }
int fmat_svd_partial_full(int n,int m,int nev,const float *a,int a_transposed, float *s,float *vout,float *uout,int nt) { arpack_eigs_t *ae=arpack_eigs_begin(n,nev); if(!ae) return -100; int ret=0; int j,i; float *ax=NEWA(float,m); int it; for(it=0;;it++) { float *x,*y; ret=arpack_eigs_step(ae,&x,&y); printf("arpack iteration %d ret=%d\r",it,ret); if(ret<0) break; /* error */ if(ret==0) break; /* stop iteration */ /* ret==1 */ if(!a_transposed) { fmat_mul_v(m,n,a,n,x,ax,nt); fmat_mul_tv(n,m,a,n,ax,y,nt); } else { fmat_mul_tv(m,n,a,m,x,ax,nt); fmat_mul_v(n,m,a,m,ax,y,nt); } fflush(stdout); } printf("\n"); free(ax); float *v=vout ? vout : fmat_new(nev,n); ret=arpack_eigs_end(ae,s,v); if(ret>0) { int nconv=ret; if(s) for(j=0;j<nconv;j++) s[j]=sqrt(s[j]); if(uout) for(i=0;i<nconv;i++) { float *u=uout+m*(long)i; if(!a_transposed) fmat_mul_v(m,n,a,n,v+n*(long)i,u,nt); else fmat_mul_tv(m,n,a,m,v+n*(long)i,u,nt); fvec_normalize(u,m,2); } } if(!vout) free(v); return ret; }
float *fmat_new_get_columns (const float *a, int nrow, int ncolout, const int *cols) { float *b = fmat_new (nrow, ncolout); fmat_get_columns(a, nrow, ncolout, cols, b); return b; }