mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 05:47:42 +00:00
Windows fixes
This commit is contained in:
@@ -47,42 +47,42 @@
|
||||
|
||||
namespace gmm {
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* Operations interfaced for T = float, double, std::complex<float> */
|
||||
/* or std::complex<double> : */
|
||||
/* */
|
||||
/* lu_factor(dense_matrix<T>, std::vector<int>) */
|
||||
/* lu_solve(dense_matrix<T>, std::vector<T>, std::vector<T>) */
|
||||
/* lu_solve(dense_matrix<T>, std::vector<int>, std::vector<T>, */
|
||||
/* std::vector<T>) */
|
||||
/* lu_solve_transposed(dense_matrix<T>, std::vector<int>, std::vector<T>,*/
|
||||
/* std::vector<T>) */
|
||||
/* lu_inverse(dense_matrix<T>) */
|
||||
/* lu_inverse(dense_matrix<T>, std::vector<int>, dense_matrix<T>) */
|
||||
/* */
|
||||
/* qr_factor(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>) */
|
||||
/* */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<T>) */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<T>, */
|
||||
/* dense_matrix<T>) */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >) */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >, */
|
||||
/* dense_matrix<T>) */
|
||||
/* */
|
||||
/* geev_interface_right */
|
||||
/* geev_interface_left */
|
||||
/* */
|
||||
/* schur(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>) */
|
||||
/* */
|
||||
/* svd(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>, std::vector<T>)*/
|
||||
/* svd(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>, */
|
||||
/* std::vector<std::complex<T> >) */
|
||||
/* */
|
||||
/* ********************************************************************* */
|
||||
/* ********************************************************************** */
|
||||
/* Operations interfaced for T = float, double, std::complex<float> */
|
||||
/* or std::complex<double> : */
|
||||
/* */
|
||||
/* lu_factor(dense_matrix<T>, std::vector<long>) */
|
||||
/* lu_solve(dense_matrix<T>, std::vector<T>, std::vector<T>) */
|
||||
/* lu_solve(dense_matrix<T>, std::vector<long>, std::vector<T>, */
|
||||
/* std::vector<T>) */
|
||||
/* lu_solve_transposed(dense_matrix<T>, std::vector<long>, std::vector<T>,*/
|
||||
/* std::vector<T>) */
|
||||
/* lu_inverse(dense_matrix<T>) */
|
||||
/* lu_inverse(dense_matrix<T>, std::vector<long>, dense_matrix<T>) */
|
||||
/* */
|
||||
/* qr_factor(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>) */
|
||||
/* */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<T>) */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<T>, */
|
||||
/* dense_matrix<T>) */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >) */
|
||||
/* implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >, */
|
||||
/* dense_matrix<T>) */
|
||||
/* */
|
||||
/* geev_interface_right */
|
||||
/* geev_interface_left */
|
||||
/* */
|
||||
/* schur(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>) */
|
||||
/* */
|
||||
/* svd(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>, std::vector<T>) */
|
||||
/* svd(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>, */
|
||||
/* std::vector<std::complex<T> >) */
|
||||
/* */
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* LAPACK functions used. */
|
||||
/* ********************************************************************* */
|
||||
/* ********************************************************************** */
|
||||
/* LAPACK functions used. */
|
||||
/* ********************************************************************** */
|
||||
|
||||
extern "C" {
|
||||
void sgetrf_(...); void dgetrf_(...); void cgetrf_(...); void zgetrf_(...);
|
||||
@@ -96,17 +96,20 @@ namespace gmm {
|
||||
void sgeesx_(...); void dgeesx_(...); void cgeesx_(...); void zgeesx_(...);
|
||||
void sgesvd_(...); void dgesvd_(...); void cgesvd_(...); void zgesvd_(...);
|
||||
}
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* LU decomposition. */
|
||||
/* ********************************************************************* */
|
||||
|
||||
# define getrf_interface(lapack_name, base_type) inline \
|
||||
size_type lu_factor(dense_matrix<base_type > &A, std::vector<int> &ipvt){\
|
||||
GMMLAPACK_TRACE("getrf_interface"); \
|
||||
int m = int(mat_nrows(A)), n = int(mat_ncols(A)), lda(m), info(0); \
|
||||
if (m && n) lapack_name(&m, &n, &A(0,0), &lda, &ipvt[0], &info); \
|
||||
return size_type(info); \
|
||||
|
||||
/* ********************************************************************** */
|
||||
/* LU decomposition. */
|
||||
/* ********************************************************************** */
|
||||
|
||||
# define getrf_interface(lapack_name, base_type) inline \
|
||||
size_type lu_factor(dense_matrix<base_type > &A, lapack_ipvt &ipvt){ \
|
||||
GMMLAPACK_TRACE("getrf_interface"); \
|
||||
long m = long(mat_nrows(A)), n = long(mat_ncols(A)), lda(m), info(-1L); \
|
||||
if (m && n) lapack_name(&m, &n, &A(0,0), &lda, ipvt.pfirst(), &info); \
|
||||
if ((info & 0xFFFFFFFF00000000L) && !(info & 0x00000000FFFFFFFFL)) \
|
||||
/* For compatibility with lapack version with 32 bit integer. */ \
|
||||
ipvt.set_to_int32(); \
|
||||
return size_type(int(info & 0x00000000FFFFFFFFL)); \
|
||||
}
|
||||
|
||||
getrf_interface(sgetrf_, BLAS_S)
|
||||
@@ -120,13 +123,13 @@ namespace gmm {
|
||||
|
||||
# define getrs_interface(f_name, trans1, lapack_name, base_type) inline \
|
||||
void f_name(const dense_matrix<base_type > &A, \
|
||||
const std::vector<int> &ipvt, std::vector<base_type > &x, \
|
||||
const lapack_ipvt &ipvt, std::vector<base_type > &x, \
|
||||
const std::vector<base_type > &b) { \
|
||||
GMMLAPACK_TRACE("getrs_interface"); \
|
||||
int n = int(mat_nrows(A)), info, nrhs(1); \
|
||||
long n = long(mat_nrows(A)), info(0), nrhs(1); \
|
||||
gmm::copy(b, x); trans1; \
|
||||
if (n) \
|
||||
lapack_name(&t, &n, &nrhs, &(A(0,0)),&n,&ipvt[0], &x[0], &n, &info); \
|
||||
lapack_name(&t,&n,&nrhs,&(A(0,0)),&n,ipvt.pfirst(),&x[0],&n,&info); \
|
||||
}
|
||||
|
||||
# define getrs_trans_n const char t = 'N'
|
||||
@@ -147,14 +150,17 @@ namespace gmm {
|
||||
|
||||
# define getri_interface(lapack_name, base_type) inline \
|
||||
void lu_inverse(const dense_matrix<base_type > &LU, \
|
||||
std::vector<int> &ipvt, const dense_matrix<base_type > &A_) { \
|
||||
const lapack_ipvt &ipvt, const dense_matrix<base_type > &A_) { \
|
||||
GMMLAPACK_TRACE("getri_interface"); \
|
||||
dense_matrix<base_type> &A \
|
||||
= const_cast<dense_matrix<base_type > &>(A_); \
|
||||
int n = int(mat_nrows(A)), info, lwork(10000); base_type work[10000]; \
|
||||
dense_matrix<base_type >& \
|
||||
A = const_cast<dense_matrix<base_type > &>(A_); \
|
||||
long n = int(mat_nrows(A)), info(0), lwork(-1); base_type work1; \
|
||||
if (n) { \
|
||||
std::copy(LU.begin(), LU.end(), A.begin()); \
|
||||
lapack_name(&n, &A(0,0), &n, &ipvt[0], &work[0], &lwork, &info); \
|
||||
gmm::copy(LU, A); \
|
||||
lapack_name(&n, &A(0,0), &n, ipvt.pfirst(), &work1, &lwork, &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name(&n, &A(0,0), &n, ipvt.pfirst(), &work[0], &lwork,&info); \
|
||||
} \
|
||||
}
|
||||
|
||||
@@ -163,20 +169,19 @@ namespace gmm {
|
||||
getri_interface(cgetri_, BLAS_C)
|
||||
getri_interface(zgetri_, BLAS_Z)
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* QR factorization. */
|
||||
/* ********************************************************************* */
|
||||
/* ********************************************************************** */
|
||||
/* QR factorization. */
|
||||
/* ********************************************************************** */
|
||||
|
||||
# define geqrf_interface(lapack_name1, base_type) inline \
|
||||
void qr_factor(dense_matrix<base_type > &A){ \
|
||||
GMMLAPACK_TRACE("geqrf_interface"); \
|
||||
int m = int(mat_nrows(A)), n = int(mat_ncols(A)), info, lwork(-1); \
|
||||
long m = long(mat_nrows(A)), n=long(mat_ncols(A)), info(0), lwork(-1); \
|
||||
base_type work1; \
|
||||
if (m && n) { \
|
||||
std::vector<base_type > tau(n); \
|
||||
lapack_name1(&m, &n, &A(0,0), &m, &tau[0], &work1 , &lwork, &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
lwork = long(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name1(&m, &n, &A(0,0), &m, &tau[0], &work[0], &lwork, &info); \
|
||||
GMM_ASSERT1(!info, "QR factorization failed"); \
|
||||
@@ -194,19 +199,19 @@ namespace gmm {
|
||||
void qr_factor(const dense_matrix<base_type > &A, \
|
||||
dense_matrix<base_type > &Q, dense_matrix<base_type > &R) { \
|
||||
GMMLAPACK_TRACE("geqrf_interface2"); \
|
||||
int m = int(mat_nrows(A)), n = int(mat_ncols(A)), info, lwork(-1); \
|
||||
long m = long(mat_nrows(A)), n=long(mat_ncols(A)), info(0), lwork(-1); \
|
||||
base_type work1; \
|
||||
if (m && n) { \
|
||||
std::copy(A.begin(), A.end(), Q.begin()); \
|
||||
std::vector<base_type > tau(n); \
|
||||
lapack_name1(&m, &n, &Q(0,0), &m, &tau[0], &work1 , &lwork, &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
lwork = long(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name1(&m, &n, &Q(0,0), &m, &tau[0], &work[0], &lwork, &info); \
|
||||
GMM_ASSERT1(!info, "QR factorization failed"); \
|
||||
base_type *p = &R(0,0), *q = &Q(0,0); \
|
||||
for (int j = 0; j < n; ++j, q += m-n) \
|
||||
for (int i = 0; i < n; ++i, ++p, ++q) \
|
||||
for (long j = 0; j < n; ++j, q += m-n) \
|
||||
for (long i = 0; i < n; ++i, ++p, ++q) \
|
||||
*p = (j < i) ? base_type(0) : *q; \
|
||||
lapack_name2(&m, &n, &n, &Q(0,0), &m,&tau[0],&work[0],&lwork,&info); \
|
||||
} \
|
||||
@@ -218,9 +223,9 @@ namespace gmm {
|
||||
geqrf_interface2(cgeqrf_, cungqr_, BLAS_C)
|
||||
geqrf_interface2(zgeqrf_, zungqr_, BLAS_Z)
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* QR algorithm for eigenvalues search. */
|
||||
/* ********************************************************************* */
|
||||
/* ********************************************************************** */
|
||||
/* QR algorithm for eigenvalues search. */
|
||||
/* ********************************************************************** */
|
||||
|
||||
# define gees_interface(lapack_name, base_type) \
|
||||
template <typename VECT> inline void implicit_qr_algorithm( \
|
||||
@@ -229,14 +234,14 @@ namespace gmm {
|
||||
double tol=gmm::default_tol(base_type()), bool compvect = true) { \
|
||||
GMMLAPACK_TRACE("gees_interface"); \
|
||||
typedef bool (*L_fp)(...); L_fp p = 0; \
|
||||
int n = int(mat_nrows(A)), info, lwork(-1), sdim; base_type work1; \
|
||||
long n=long(mat_nrows(A)), info(0), lwork(-1), sdim; base_type work1; \
|
||||
if (!n) return; \
|
||||
dense_matrix<base_type > H(n,n); gmm::copy(A, H); \
|
||||
char jobvs = (compvect ? 'V' : 'N'), sort = 'N'; \
|
||||
std::vector<double> rwork(n), eigv1(n), eigv2(n); \
|
||||
lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigv1[0], \
|
||||
&eigv2[0], &Q(0,0), &n, &work1, &lwork, &rwork[0], &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
lwork = long(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigv1[0], \
|
||||
&eigv2[0], &Q(0,0), &n, &work[0], &lwork, &rwork[0],&info);\
|
||||
@@ -251,14 +256,14 @@ namespace gmm {
|
||||
double tol=gmm::default_tol(base_type()), bool compvect = true) { \
|
||||
GMMLAPACK_TRACE("gees_interface2"); \
|
||||
typedef bool (*L_fp)(...); L_fp p = 0; \
|
||||
int n = int(mat_nrows(A)), info, lwork(-1), sdim; base_type work1; \
|
||||
long n=long(mat_nrows(A)), info(0), lwork(-1), sdim; base_type work1; \
|
||||
if (!n) return; \
|
||||
dense_matrix<base_type > H(n,n); gmm::copy(A, H); \
|
||||
char jobvs = (compvect ? 'V' : 'N'), sort = 'N'; \
|
||||
std::vector<double> rwork(n), eigvv(n*2); \
|
||||
lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigvv[0], \
|
||||
&Q(0,0), &n, &work1, &lwork, &rwork[0], &rwork[0], &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
lwork = long(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigvv[0], \
|
||||
&Q(0,0), &n, &work[0], &lwork, &rwork[0], &rwork[0],&info);\
|
||||
@@ -276,18 +281,18 @@ namespace gmm {
|
||||
# define jobv_left char jobvl = 'V', jobvr = 'N';
|
||||
|
||||
# define geev_interface(lapack_name, base_type, side) \
|
||||
template <typename VECT> inline void geev_interface_ ## side( \
|
||||
template <typename VECT> inline void geev_interface_ ## side( \
|
||||
const dense_matrix<base_type > &A, const VECT &eigval_, \
|
||||
dense_matrix<base_type > &Q) { \
|
||||
GMMLAPACK_TRACE("geev_interface"); \
|
||||
int n = int(mat_nrows(A)), info, lwork(-1); base_type work1; \
|
||||
long n = long(mat_nrows(A)), info(0), lwork(-1); base_type work1; \
|
||||
if (!n) return; \
|
||||
dense_matrix<base_type > H(n,n); gmm::copy(A, H); \
|
||||
jobv_ ## side \
|
||||
std::vector<base_type > eigvr(n), eigvi(n); \
|
||||
lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigvr[0], &eigvi[0], \
|
||||
&Q(0,0), &n, &Q(0,0), &n, &work1, &lwork, &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
lwork = long(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigvr[0], &eigvi[0], \
|
||||
&Q(0,0), &n, &Q(0,0), &n, &work[0], &lwork, &info); \
|
||||
@@ -301,7 +306,7 @@ namespace gmm {
|
||||
const dense_matrix<base_type > &A, const VECT &eigval_, \
|
||||
dense_matrix<base_type > &Q) { \
|
||||
GMMLAPACK_TRACE("geev_interface"); \
|
||||
int n = int(mat_nrows(A)), info, lwork(-1); base_type work1; \
|
||||
long n = long(mat_nrows(A)), info(0), lwork(-1); base_type work1; \
|
||||
if (!n) return; \
|
||||
dense_matrix<base_type > H(n,n); gmm::copy(A, H); \
|
||||
jobv_ ## side \
|
||||
@@ -309,7 +314,7 @@ namespace gmm {
|
||||
std::vector<base_type> eigv(n); \
|
||||
lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigv[0], &Q(0,0), &n, \
|
||||
&Q(0,0), &n, &work1, &lwork, &rwork[0], &info); \
|
||||
lwork = int(gmm::real(work1)); \
|
||||
lwork = long(gmm::real(work1)); \
|
||||
std::vector<base_type > work(lwork); \
|
||||
lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigv[0], &Q(0,0), &n, \
|
||||
&Q(0,0), &n, &work[0], &lwork, &rwork[0], &info); \
|
||||
@@ -328,32 +333,32 @@ namespace gmm {
|
||||
geev_interface2(zgeev_, BLAS_Z, left)
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* SCHUR algorithm: */
|
||||
/* A = Q*S*(Q^T), with Q orthogonal and S upper quasi-triangula */
|
||||
/* ********************************************************************* */
|
||||
/* ********************************************************************** */
|
||||
/* SCHUR algorithm: */
|
||||
/* A = Q*S*(Q^T), with Q orthogonal and S upper quasi-triangula */
|
||||
/* ********************************************************************** */
|
||||
|
||||
# define geesx_interface(lapack_name, base_type) inline \
|
||||
void schur(dense_matrix<base_type> &A, \
|
||||
dense_matrix<base_type> &S, \
|
||||
dense_matrix<base_type> &Q) { \
|
||||
GMMLAPACK_TRACE("geesx_interface"); \
|
||||
int m = int(mat_nrows(A)), n = int(mat_ncols(A)); \
|
||||
long m = long(mat_nrows(A)), n = long(mat_ncols(A)); \
|
||||
GMM_ASSERT1(m == n, "Schur decomposition requires square matrix"); \
|
||||
char jobvs = 'V', sort = 'N', sense = 'N'; \
|
||||
bool select = false; \
|
||||
int lwork = 8*n, sdim = 0, liwork = 1; \
|
||||
long lwork = 8*n, sdim = 0, liwork = 1; \
|
||||
std::vector<base_type> work(lwork), wr(n), wi(n); \
|
||||
std::vector<int> iwork(liwork); \
|
||||
std::vector<int> bwork(1); \
|
||||
std::vector<long> iwork(liwork); \
|
||||
std::vector<long> bwork(1); \
|
||||
resize(S, n, n); copy(A, S); \
|
||||
resize(Q, n, n); \
|
||||
base_type rconde(0), rcondv(0); \
|
||||
int info = -1; \
|
||||
long info(0); \
|
||||
lapack_name(&jobvs, &sort, &select, &sense, &n, &S(0,0), &n, \
|
||||
&sdim, &wr[0], &wi[0], &Q(0,0), &n, &rconde, &rcondv, \
|
||||
&work[0], &lwork, &iwork[0], &liwork, &bwork[0], &info);\
|
||||
GMM_ASSERT1(!info, "SCHUR algorithm failed"); \
|
||||
GMM_ASSERT1(!info, "SCHUR algorithm failed"); \
|
||||
}
|
||||
|
||||
# define geesx_interface2(lapack_name, base_type) inline \
|
||||
@@ -361,18 +366,18 @@ namespace gmm {
|
||||
dense_matrix<base_type> &S, \
|
||||
dense_matrix<base_type> &Q) { \
|
||||
GMMLAPACK_TRACE("geesx_interface"); \
|
||||
int m = int(mat_nrows(A)), n = int(mat_ncols(A)); \
|
||||
long m = long(mat_nrows(A)), n = long(mat_ncols(A)); \
|
||||
GMM_ASSERT1(m == n, "Schur decomposition requires square matrix"); \
|
||||
char jobvs = 'V', sort = 'N', sense = 'N'; \
|
||||
bool select = false; \
|
||||
int lwork = 8*n, sdim = 0; \
|
||||
long lwork = 8*n, sdim = 0; \
|
||||
std::vector<base_type::value_type> rwork(lwork); \
|
||||
std::vector<base_type> work(lwork), w(n); \
|
||||
std::vector<int> bwork(1); \
|
||||
std::vector<long> bwork(1); \
|
||||
resize(S, n, n); copy(A, S); \
|
||||
resize(Q, n, n); \
|
||||
base_type rconde(0), rcondv(0); \
|
||||
int info = -1; \
|
||||
long info(0); \
|
||||
lapack_name(&jobvs, &sort, &select, &sense, &n, &S(0,0), &n, \
|
||||
&sdim, &w[0], &Q(0,0), &n, &rconde, &rcondv, \
|
||||
&work[0], &lwork, &rwork[0], &bwork[0], &info); \
|
||||
@@ -391,10 +396,10 @@ namespace gmm {
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* Interface to SVD. Does not correspond to a Gmm++ functionnality. */
|
||||
/* Author : Sebastian Nowozin <sebastian.nowozin@tuebingen.mpg.de> */
|
||||
/* ********************************************************************* */
|
||||
/* ********************************************************************** */
|
||||
/* Interface to SVD. Does not correspond to a Gmm++ functionnality. */
|
||||
/* Author : Sebastian Nowozin <sebastian.nowozin@tuebingen.mpg.de> */
|
||||
/* ********************************************************************** */
|
||||
|
||||
# define gesvd_interface(lapack_name, base_type) inline \
|
||||
void svd(dense_matrix<base_type> &X, \
|
||||
@@ -402,15 +407,15 @@ namespace gmm {
|
||||
dense_matrix<base_type> &Vtransposed, \
|
||||
std::vector<base_type> &sigma) { \
|
||||
GMMLAPACK_TRACE("gesvd_interface"); \
|
||||
int m = int(mat_nrows(X)), n = int(mat_ncols(X)); \
|
||||
int mn_min = m < n ? m : n; \
|
||||
long m = long(mat_nrows(X)), n = long(mat_ncols(X)); \
|
||||
long mn_min = m < n ? m : n; \
|
||||
sigma.resize(mn_min); \
|
||||
std::vector<base_type> work(15 * mn_min); \
|
||||
int lwork = int(work.size()); \
|
||||
long lwork = long(work.size()); \
|
||||
resize(U, m, m); \
|
||||
resize(Vtransposed, n, n); \
|
||||
char job = 'A'; \
|
||||
int info = -1; \
|
||||
long info(0); \
|
||||
lapack_name(&job, &job, &m, &n, &X(0,0), &m, &sigma[0], &U(0,0), \
|
||||
&m, &Vtransposed(0,0), &n, &work[0], &lwork, &info); \
|
||||
}
|
||||
@@ -421,16 +426,16 @@ namespace gmm {
|
||||
dense_matrix<base_type> &Vtransposed, \
|
||||
std::vector<base_type2> &sigma) { \
|
||||
GMMLAPACK_TRACE("gesvd_interface"); \
|
||||
int m = int(mat_nrows(X)), n = int(mat_ncols(X)); \
|
||||
int mn_min = m < n ? m : n; \
|
||||
long m = long(mat_nrows(X)), n = long(mat_ncols(X)); \
|
||||
long mn_min = m < n ? m : n; \
|
||||
sigma.resize(mn_min); \
|
||||
std::vector<base_type> work(15 * mn_min); \
|
||||
std::vector<base_type2> rwork(5 * mn_min); \
|
||||
int lwork = int(work.size()); \
|
||||
long lwork = long(work.size()); \
|
||||
resize(U, m, m); \
|
||||
resize(Vtransposed, n, n); \
|
||||
char job = 'A'; \
|
||||
int info = -1; \
|
||||
long info(0); \
|
||||
lapack_name(&job, &job, &m, &n, &X(0,0), &m, &sigma[0], &U(0,0), \
|
||||
&m, &Vtransposed(0,0), &n, &work[0], &lwork, \
|
||||
&rwork[0], &info); \
|
||||
|
||||
Reference in New Issue
Block a user