包括的な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
パッケージマネージャーを使用しても同じ結果が得られました。私は次のことをしました:
Sudo apt-get install libblas-dev checkinstall
Sudo apt-get install libblas-doc checkinstall
Sudo apt-get install liblapacke-dev checkinstall
Sudo apt-get install liblapack-doc checkinstall
ライブラリは/ usr/libにあり、インクルードは/ usr/includeにあります。
前の投稿のサンプルコードについて Markus-Hermann に感謝します。それは私がそれを本当に素早くテストするのを助けました。デフォルトのインストールディレクトリを使用して、次のコマンドを使用しました。
g++ svd_demo.cpp -I"/usr/include" -L"/usr/lib" -llapacke -lblas