void rotate_fd(FrequentDirections* self){
  double* S = (double*) malloc(sizeof(double) * self->m);
  double* U = (double*) malloc(sizeof(double) * self->m * self->m);
  double* Vt = (double*) malloc(sizeof(double) * self->m * self->dimension);


  int info = LAPACKE_dgesdd(LAPACK_ROW_MAJOR, 'S', self->m, self->dimension, self->sketch, self->dimension, S, U, self->m, Vt, self->dimension);


  // compute S*Vt
  for(int i=0; i < self->ell; i++){
    S[i] = sqrt( pow(S[i],2) - pow(S[self->ell - 1],2) );
    for(int j=0; j < self->dimension; j++)
      self->sketch[i * self->dimension + j] = Vt[i * self->dimension + j] * S[i] ;
  }

  memset(&self->sketch[self->ell * self->dimension], 0, self->ell * self->dimension * sizeof(double));


  self->nextRow = self->ell;  
  free(S); free(U); free(Vt); 
}
Esempio n. 2
0
static void bench_gesdd(int size, double *A, double *U, double *VT, double *S)
{
    int i, iter = 1;
    double start, stop;
    double gflops, peak;

    if ((double) size * (double) size * (double) size <= 1.e12)	iter = 2;
    if ((double) size * (double) size * (double) size <= 1.e10)	iter = 3;
    if ((double) size * (double) size * (double) size <= 1.e8)	iter = 5;

    peak = 0.;
    for (i = 0; i < iter; i++) {
	start = gettime();
	LAPACKE_dgesdd(LAPACK_COL_MAJOR, 'A', size, size, A, size, S, U, size, VT, size);
	stop = gettime();
	gflops = getgflops(size, stop - start);
	if (peak < gflops) peak = gflops;
    }
    printf("%4d, %10.3f\n", size, peak);
    fflush(stdout);
    return;
}