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); }
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; }