#include #include #include #include //definition for lapack / blas routines int dgemm_( char *transa, char *transb, const int *m, const int *n, const int *k, double *alpha, const double *a, const int *lda, const double *b, const int *ldb, double *beta, double *c, const int *ldc); int dsyev_( char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info); /** [mk_diag diag mat n m] ~ makes a diagonal matrix from an array * Places the [m] elements of [diag] along diagonal of [mat] with [n] cols */ void mk_diag(double* diag, double* mat, int n, const int m) { int i; for(i =0; i < m; ++i) mat[i*n+i] = diag[i]; } int main() { int i, j; double m[16] = { //rowmajor 0, 1, 2, 3, 1, 2, 6, 4, 2, 6, 7, 5, 3, 4, 5, 6 }; int n = 4; int info = 0; char jobz = 'V'; char uplo = 'U'; int lwork = n * n; //print initial matrix printf ("\nInitial Matrix (A):\n\t"); for (i=0; i= max(1,3*n-1) &info); //**returns info on results //== 0, success; // < 0, -ith argument had issue; // > 0, failed in convergence if ( info != 0 ){ printf("error: %d", info); return 0; } //create all the vectors/matrices we need // diagonal matrix of eigenvalues... double* d = (double*) malloc( n*n*sizeof(double)); mk_diag( x, d, n, n); printf("\nD :\n\t"); for (i=0; i