diff options
author | Pjotr Prins | 2020-05-22 11:21:45 -0500 |
---|---|---|
committer | Pjotr Prins | 2020-05-22 11:21:45 -0500 |
commit | f1cd914e6f20c9a162e16d7283477c1b98d005d1 (patch) | |
tree | 0a23068f9b06525ded025450c209b3a1dcf94b38 /src/fastblas.cpp | |
parent | 862ace03212ed17bdc1ab349bfab55543720a980 (diff) | |
parent | b309569fe9497befa008ac2d2cbc04f2e861ce76 (diff) | |
download | pangemma-f1cd914e6f20c9a162e16d7283477c1b98d005d1.tar.gz |
Merge branch 'master' of github.com:genenetwork/GEMMA
Diffstat (limited to 'src/fastblas.cpp')
-rw-r--r-- | src/fastblas.cpp | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/fastblas.cpp b/src/fastblas.cpp index b3fcddb..42c59ee 100644 --- a/src/fastblas.cpp +++ b/src/fastblas.cpp @@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "gsl/gsl_matrix.h" +// #include "gsl/gsl_matrix.h" #include <algorithm> // std::min #include <cmath> #include <iomanip> @@ -29,6 +29,7 @@ #include "mathfunc.h" #include <string.h> #include "eigenlib.h" +#include <cblas.h> const char *FastblasTrans = "T"; const char *FastblasNoTrans = "N"; @@ -235,8 +236,44 @@ void fast_dgemm(const char *TransA, const char *TransB, const double alpha, void fast_eigen_dgemm(const char *TransA, const char *TransB, const double alpha, const gsl_matrix *A, const gsl_matrix *B, const double beta, gsl_matrix *C) { - if (is_legacy_mode()) - eigenlib_dgemm(TransA,TransB,alpha,A,B,beta,C); - else fast_cblas_dgemm(TransA,TransB,alpha,A,B,beta,C); } + +/* + * Inverse in place + */ + +#include <gsl/gsl_permutation.h> +// #include <gsl/gsl_linalg.h> + +extern "C" { + int gsl_linalg_LU_invert(const gsl_matrix * LU, const gsl_permutation * p, gsl_matrix * inverse); + int gsl_linalg_LU_decomp(gsl_matrix * A, gsl_permutation * p, int * signum); +} + +void gsl_matrix_inv(gsl_matrix *m) +{ + size_t n=m->size1; + + gsl_matrix *temp1=gsl_matrix_calloc(n,n); + gsl_matrix_memcpy(temp1,m); + + gsl_permutation *p=gsl_permutation_calloc(n); + int sign=0; + gsl_linalg_LU_decomp(temp1,p,&sign); + gsl_matrix *inverse=gsl_matrix_calloc(n,n); + + gsl_linalg_LU_invert(temp1,p,inverse); + gsl_matrix_memcpy(m,inverse); + + gsl_permutation_free(p); + gsl_matrix_free(temp1); + gsl_matrix_free(inverse); + +} + +void fast_inverse(gsl_matrix *m) { + gsl_matrix_inv(m); +} + + |