double mxm_invert(double *r, const double *a, const int N) { mxm_local_block(a2, double, N); mxm_set(a2, a, N); double det = internal_invert(a2, r, N); mxm_free_local(a2); return det; }
real mxm_invert(real *r, const real *a, const int N) { mxm_local_block(a2, real, N); mxm_set(a2, a, N); real det = internal_invert(a2, r, N); mxm_free_local(a2); return det; }
double mxm_solve(double *x, const double *A, const double *b, const int N) { mxm_local_block(a2, double, N); mxm_set(a2, A, N); mxv_set(x, b, N); double det = internal_solve(a2, x, N); mxm_free_local(a2); return det; }
real mxm_solve(real *x, const real *A, const real *b, const int N) { mxm_local_block(a2, real, N); mxm_set(a2, A, N); mxv_set(x, b, N); real det = internal_solve(a2, x, N); mxm_free_local(a2); return det; }
// Originally based on public domain code by <*****@*****.**> // which can be found at http://lib.stat.cmu.edu/general/ajay // // The factorization is valid as long as the returned nullity == 0 // U contains the upper triangular factor itself. // int mxm_cholesky(double *U, const double *A, const int N) { double sum; int nullity = 0; mxm_set(U, 0.0, N); for(int i=0; i<N; i++) { /* First compute U[i][i] */ sum = mxm_ref(A, i, i, N); for(int j=0; j<=(i-1); j++) sum -= mxm_ref(U, j, i, N) * mxm_ref(U, j, i, N); if( sum > 0 ) { mxm_ref(U, i, i, N) = _sqrt(sum); /* Now find elements U[i][k], k > i. */ for(int k=(i+1); k<N; k++) { sum = mxm_ref(A, i, k, N); for(int j=0; j<=(i-1); j++) sum -= mxm_ref(U, j, i, N)*mxm_ref(U, j, k, N); mxm_ref(U, i, k, N) = sum / mxm_ref(U, i, i, N); } } else { for(int k=i; k<N; k++) mxm_ref(U, i, k, N) = 0.0; nullity++; } } return nullity; }