質問: ubuntuでの包括的なlapack実装のインストール 包括的なlapackパッケージを適切にインストールする方法を尋ねたいと思います。 ubuntu環境内のgentooパッケージ「sci-libs/clapack」によって提供されます。私はここでアトラスについて話しているのではありません。アトラスはlapack機能のごく一部しか提供していませんが、たとえば「dstegr」のような固有値の問題。これまでに達成したことは次のとおりです。私のお気に入りの検索コマンドapt-file search clapack.h 提供できるソースは2つだけです。libatlas-dev: /usr/include/atlas/clapack.h libfreefem++-dev: /usr/include/freefem++/clapack.h 前述のように、アトラスバージョンは、私が望むものではありません。一方、libfreefemのバリエーションは問題ありません。そうapt-get install libfreefem++-dev 加えてapt-cache search lapack たくさんの、最も有望なラインがありますliblapack-dev - library of linear algebra routines 3 - static version liblapack3gf - library of linear algebra routines 3 - shared version 私がインストールした最初のパッケージ。追加中#include <freefem++/clapack.h> 私のプログラムにスタイルのエラーの理解可能な長いリストを返します'integer'、 'real'、 'doublereal'、...はこのスコープで宣言されていません実際にはそうではありませんでした。とにかく、私はfreefemやatlasを探しているわけではありませんが、実行中の使いやすいlapack実装だけが、ubuntuにそんなものはないのでしょうか?自分の投稿を読み直すと、「liblapack-dev」の包括的なヘッダーファイルはどこで入手できますか?
回答: 私に合ったソリューションを見つけました。後でこれを読んで、同様の問題を抱えているかもしれない人のための一番下の行: lapackホームページ に行き、lapackの最新バージョンをtar gzとしてダウンロードし、それを解凍して、 同じサイトのインストールガイドで発行された指示。トラブルに遭遇した:makefileで行を削減しなければならなかったall: lapack_install lib blas_testing lapack_testing にall: lapack_install lib その後make ./liblapack.aと./libtmglib.aをくれました。そんなにfortran。ただし、cプログラムに挿入するものが必要です。これは私もlapackeが欲しいことを意味します。サブディレクトリ./lapacke/にあります。既に存在するmakefileを直接呼び出して無視したcmakelists.txtがあります(短くて読みやすく、インストールガイドに従って作成したmake.incファイルを使用します上記に言及)。ここでの唯一の欠点は、 lapacke_mangling.h の欠如でした。これを./lapacke/include/にコピーする必要がありました。これにより、ディレクトリ./lapacke/から「make」の呼び出しが実行され、。/ lapacke.aを作成する際に問題なく実行され、小さなデモプログラムを作成する準備が整いました。/** * svd_demo.cpp * * given that you put version 3.5.0 into /opt/lapack/ compile this with: * g++ svd_demo.cpp -i"/opt/lapack/lapack-3.5.0/lapacke/include" \ * -l"/opt/lapack/lapack-3.5.0" -llapacke -llapack -lblas -lcblas * the order of included libraries is important! */ #include <iostream> #include <string> #include <sstream> #include <cstdlib> #include <cblas.h> #include <lapacke.h> using namespace std; typedef double value; /** column major style! */ string matrix2string(int m, int n, value* a) { ostringstream oss; for (int j=0;j<m;j++) { for (int k=0;k<n;k++) { oss << a[j+k*m] << "\t"; } oss << endl; } return oss.str(); } int main(int argc, char** argv) { //> part 1. decomposition. ----------------------------------------- char jobu = 'a'; // return the complete matrix u char jobvt = 'a'; // return the complete matrix vt int ma = 2; int na = 3; int lda = 2; int ldu = 2; int ldvt = 3; int lwork = 81; int info = 0; value* a = (value*)malloc(ma*na*sizeof(value)); value* u = (value*)malloc(ma*ma*sizeof(value)); value* vt = (value*)malloc(na*na*sizeof(value)); value* svec = (value*)malloc(3*sizeof(value)); value* work = (value*)malloc(lwork*sizeof(value)); a[0] = 1; a[2] = 2; a[4] = 4; a[1] = 0; a[3] = 0; a[5] = 4; cout << "matrix a (will be overwritten, as is documented):" << endl << matrix2string(ma,na,a); // citing lapacke.h //lapack_int lapacke_dgesvd(int matrix_order, char jobu, char jobvt, // lapack_int m, lapack_int n, double* a, // lapack_int lda, double* s, double* u, lapack_int ldu, // double* vt, lapack_int ldvt, double* superb); info = lapacke_dgesvd(lapack_col_major, jobu, jobvt, ma, na, a, lda, svec, u, ldu, vt, ldvt, work); cout << "ran dgesvd. let's see ..." << endl << "u:" << endl << matrix2string(ma,ma,u) << "svec:" << endl << matrix2string(1,na,svec) << "vt:" << endl << matrix2string(na,na,vt) << "info code: " << info << endl << endl << "all is well." << endl; //< ---------------------------------------------------------------- //> part 2. checking the result. ----------------------------------- value* s = (value*)malloc(ma*na*sizeof(value)); s[0] = svec[0]; s[2] = 0 ; s[4] = 0 ; s[1] = 0 ; s[3] = svec[1]; s[5] = 0 ; // citing cblas.h // void cblas_dgemm(const enum cblas_order order, const enum cblas_transpose transa, // const enum cblas_transpose transb, const int m, const int n, // const int k, const double alpha, const double *a, // const int lda, const double *b, const int ldb, // const double beta, double *c, const int ldc); // work := s*vt; (2x3)=(2x3)*(3x3) cblas_dgemm(cblascolmajor,cblasnotrans,cblasnotrans,ma,na,na,1,s,lda,vt,ldvt,0,work,lda) ; cout << "step 1: s*vt" << endl << matrix2string(2,3,work); // a := u*work; (2x2)*(2x3) cblas_dgemm(cblascolmajor,cblasnotrans,cblasnotrans,ma,na,ma,1,u,ldu,work,lda,0,a,lda); cout << "a := u*s*vt:" << endl << matrix2string(ma,na,a) << endl; //< ---------------------------------------------------------------- free(a); free(u); free(vt); free(svec); free(work); free(s); return exit_success; } 私のシステムでは、これが出力を生成します1 2 4 0 0 4 ran dgesvd. let's see ... u: -0.759729 -0.65024 -0.65024 0.759729 svec: 5.89017 1.51851 0 vt: -0.128982 -0.257965 -0.957506 -0.42821 -0.856419 0.288414 -0.894427 0.447214 -7.48099e-18 info code: 0 all is well. step 1: s*vt -0.759729 -1.51946 -5.63988 -0.65024 -1.30048 0.437958 a := u*s*vt: 1 2 4 -9.63558e-16 -4.86265e-17 4 blasに関しては、インストールしましたlibblas-dev - basic linear algebra subroutines 3, static library libblas3gf - basic linear algebra reference implementations, shared library libopenblas-dev - optimized blas (linear algebra) library based on gotoblas2 その結果、私が使用したlapackメインmakefileでblaslib = /usr/lib/openblas-base/libopenblas.a