贡献者: addis
【更新】本文已过时,最新版改名为 MPLAPACK,见 GitHub 仓库。推荐的用 Docker 编译需要 3 小时左右,但很稳定。编译完成以后,library 安装到 container 的目录 /home/docker/MPLAPACK
中。__float128
也真正的支持了。
以下内容已过时。
dd
),八精度(qd),乃至任意精度的 BLAS 和 LAPACK。源码主要是 C++。
conda install -c auto-mech mpack
。亲测有效,安装路径在 ~/miniconda3/pkgs/mpack-0.6.8-0/
x86
下的 Ubuntu 22.04 也可以直接从笔者的 github 仓库下载。
libmlapack_dd.so
,头文件 mlapack_dd.h
inv_mat_dd
成功! 路径在 mpack-0.6.7/examples/mlapack/
:
g++ inv_mat_dd.cpp -I ~/miniconda3/pkgs/mpack-0.6.8-0/include/mpack -I ~/miniconda3/pkgs/mpack-0.6.8-0/include -L ~/miniconda3/pkgs/mpack-0.6.8-0/lib -Wl,-rpath,/home/addis/miniconda3/envs/mpack/lib -l mlapack_dd -l mblas_dd -l qd
__float128
,但源码中并没有搜到任何相关内容,似乎目前还是只能使用 QD
库。
example
里面的 *_dd.cpp
源码
mpackint
类型为 long long
(8 字节符号整数)
dd_real
类的定义为(头文件 include/qd/dd_real.h
,这其实是 QD 库的头文件,有微量修改。)
struct dd_real {
double x[2];
public:
dd_real(double, double);
dd_real(void);
dd_real(double);
dd_real(int);
dd_real(const char *);
dd_real(const double *);
...
};
dd_complex
类的定义为(头文件 include/mpack/dd_complex.h
)
class dd_complex {
private:
dd_real re;
dd_real im;
public:
dd_complex(void);
dd_complex(const dd_complex &);
dd_complex(const dd_real &, const dd_real &);
dd_complex(const dd_real &);
dd_complex(const std::complex<double> &);
const dd_real & real(void) const;
dd_real & real(void);
const dd_real & imag(void) const;
dd_real & imag(void);
dd_complex & operator=(std::complex<double>);
dd_complex & operator=(dd_real);
dd_complex & operator=(double);
dd_complex & operator+=(const dd_complex &);
dd_complex & operator+=(const dd_real &);
mlapack_dd.h
中的 lapack 函数以 R
(实数)或者 C
(复数)开头,例如 ?gbsv
函数为 Rgbsv
。函数的用法应该都是一样的。
void Rgbsv(mpackint n, mpackint kl, mpackint ku, mpackint nrhs,
dd_real *AB, mpackint ldab, mpackint *ipiv, dd_real *B,
mpackint ldb, mpackint *info);
void Cgbsv(mpackint n, mpackint kl, mpackint ku, mpackint nrhs,
dd_complex *ab, mpackint ldab, mpackint *ipiv, dd_complex *b,
mpackint ldb, mpackint *info);