2

質問は少し奇妙に聞こえるかもしれません。BoostのublasとATLAS/Lapackを使用して数値行列の計算を行いたいのです。Boost数値バインディングを使用して、これら2つのライブラリ間のインターフェイスを作成しています。ただし、それが見つからないか、これらのバインディングの使用方法に関する適切なドキュメントがありません。また、私はBoost(そして実際には一般的にC ++)に慣れていないので、コードでLapackによって提供される関数をどのように使用できるかを見つけるのに苦労しています。

最後に解決したい問題は、対称帯行列の固有値とベクトルを見つけることです。私が理解している限り、私はこれに使用lapack::steqrします。問題は、関数を適切に呼び出す方法がわかりません。数値バインディングのコードでは、次のようなものを見ることができます。

template <typename D, typename E, typename Z, typename W>
inline
int steqr( char compz, D& d, E& e, Z& z, W& work ) {

  int const n = traits::vector_size (d);
  assert( traits::vector_size (e) == n-1 );
  assert( traits::matrix_size1 (z) == n );
  assert( traits::matrix_size2 (z) == n );
  assert( compz=='N' || compz=='V' || compz=='I' );
  ...

さて、どうすればそれを処理できますか?steqr<double, double, double, double>(...)配列を2倍にしてみましたが、うまくいきませんでした。次に、使用する適切な引数を見つけるために、アサーションの1つを選択し、動作するものを見つけようとしました。traits::matrix_size1(...)ダブル配列でも。でも、コンパイルできませんでしたublas::matrix

したがって、私の質問は、一般的に、完全なドキュメントなしでそのようなライブラリを見つけた場合、関数を呼び出す方法を見つけるにはどうすればよいですか?私は主にCから来ており、これらすべてのテンプレートと非常に混乱しています。コード内のすべてを本当に追跡する唯一の方法はありますか?それともちょっとしたトリックがありますか?または、おそらくエラーメッセージから情報を引き出すことができますか?

このようなエラーメッセージの1つの例は、次のコードの場合です。

ublas::matrix<double> empty(N,N);
std::cout << traits::matrix_size1<ublas::matrix>(empty) << std::endl;

次に、コンパイル中に取得します。

eigenvalues.cpp:40:85: error: no matching function for call to ‘matrix_size1(boost::numeric::ublas::matrix<double, boost::numeric::ublas::basic_row_major<>, boost::numeric::ublas::unbounded_array<double, std::allocator<double> > >&)’
eigenvalues.cpp:40:85: note: candidate is:
/usr/include/boost/numeric/bindings/traits/matrix_traits.hpp:148:18: note: template<class M> std::ptrdiff_t boost::numeric::bindings::traits::matrix_size1(M&)

候補がそこにリストされていることはおそらく便利ですが、この行を読み、それに応じてコードを調整する方法がわかりません。

繰り返しますが、この質問は、このようなものに対処する方法について、もう少し一般的です。クラスとテンプレートの基本的な概念は知っていますが、これは私の知識には少し抽象的すぎます。

4

1 に答える 1

1

私はテンプレート化された C++ にあまり精通していないので、個人的にcblasは、元の Fortran コードのシン ラッパーにすぎないインターフェイスを使用する方がはるかに簡単だと感じています。

このアプローチでは、マトリックスの独自のクラスを作成する必要があります。これは、マトリックスが何であるかについての Fortran の理解と互換性があります。最も簡単な方法は、おそらく から継承するstd::vectorstd::valarray、独自のインデックス操作を提供することです。はい、ちょっとした作業です。しかし、思ったほど悪くはありません:-)。

ところで、単精度ルーチン ( ssteqr) を倍精度引数とともに使用することに注意してください。LAPACK はエラーを報告しませんが、結果は明らかに間違っています。

于 2011-12-10T19:41:08.193 に答える