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); }
// fisher-yates void shuffle(void *t, int n, size_t s) { char *c = t; for (int i = 0; i < n-1; i++) swap(c + s*i, c + s*randombounds(i, n-1), s); }
int randombounds(int a, int b) { if (b < a) return randombounds(b, a); if (b == a) return b; return a + rand()%(b - a + 1); }
static int randombounds(int a, int b) { if (b < a) return randombounds(b, a); if (b == a) return b; return a + lcg_knuth_rand() % (b - a + 1); }
static float float_pick(float *x, int n) { if (n) { int i = randombounds(0, n-1); return x[i]; } else fail("empty list of pixel values!"); }
static void statistics_getf_spoilable(struct statistics_float *s, float *f, int n) { s->middle = f[n/2-1]; int mt = STATISTIC_MEDIAN_BIAS; int mi = STATISTIC_MIDDLE_BIAS; switch(mi) { case -1: break; case 0: s->middle += f[n/2]; s->middle /=2; break; case 1: s->middle = f[n/2]; break; default: error("bad STATISTIC_MEDIAN_BIAS %d", mt); } // qsort(f, n, sizeof*f, compare_floats); s->min = f[0]; s->max = f[n-1]; s->median = f[n/2-1]; if (EVENP(n)) { int mtype = STATISTIC_MEDIAN_BIAS; switch(mtype) { case -1: break; case 0: s->median += f[n/2]; s->median /=2; break; case 1: s->median = f[n/2]; break; default: error("bad STATISTIC_MEDIAN_BIAS %d", mtype); } } s->average = 0; for (int i = 0; i < n; i++) s->average += f[i]; s->average /= n; s->laverage = 0; for (int i = 0; i < n; i++) s->laverage += exp(f[i]/255); s->laverage = log(s->laverage/n)*255; s->variance = 0; for (int i = 0; i < n; i++) s->variance = hypot(s->variance, s->average - f[i]); s->sample = f[randombounds(0, n-1)]; }
float op_random(float* data, int N){ return data[randombounds(0, N-1)]; }