0

材料:

  1. 行列要素タイプでテンプレート化された行列クラス。サブ行列やダブル/フロートなどで機能することを目的としています。

  2. 「真の」対角線を返す行列メンバーメソッド。つまり、NxNの場合、それらの対角線、つまりサイズNのベクトルのベクトルを部分行列化します。

  3. サブマトリックスの実装に関する制限をできるだけ少なくし、サブマトリックスを使用しない場合の不要な「副作用」/要件はありませんが、たとえば2倍にします。

  4. いくつかのアルゴリズムでの行列クラスのシームレスな使用。たとえば、共役勾配法。理想的には、いくつかの一般的な行列型とベクトル型でテンプレート化する必要があります。

アイデアは、行列のGetDiagonalElements()メソッドにファンクターを提供することでした。これには、diagional-elementをコピーするだけのデフォルト値があります。マトリックスの実際のサイズ(1x1のみ)を無視して、その機能を提供するための私の試みは次のとおりです。

#include <vector>

template< typename T >
struct Matrix
{
  std::vector<T> data;
  Matrix() : data(1) {}

  // Default-functor for T2=T or convertible.
  template< typename T2 >
  struct GetDiagonalElementsFunc
  {
    void operator()( const T &t1, T2 &t2 ) { t2 = (T2)t1; }
  };

  template< typename T2, typename GetDiagonalElementsFunctor >
  void GetDiagonalElements( std::vector<T2> &diag,
    GetDiagonalElementsFunctor gdeFunctor=GetDiagonalElementsFunc<T2> 
  {
      diag.resize(1)
      gdeFunctor( data[0], diag[0] );
  }
};

void foo()
{
  Matrix<double> mat;
  std::vector<double> diag;
  mat.GetDiagonalElements(diag);

}

コンパイラは「言う」:「GetDiagonalElementsFunctor」のテンプレート引数を推測できませんでした

ファンクターをテンプレートとして推測します-引数は必要ありません-私は試しましたが、それも機能しませんでした。おそらく単純(?)ですが、助けていただければ幸いです、Derik。

PS:理想的には、可能であれば、追加/中間のヘルパータイプはありません。ブーストなし、C++11なし。

追加の質問:同じことをしたいが、matrix-template-declaration(?)の一部としてdiagonal-access-functorを指定したい場合はどうすればよいですか?

4

1 に答える 1

3

C ++ 98の関数ではデフォルトのテンプレートパラメータを使用できません...したがって、この場合はstructまたは2つの関数を使用する必要があります...2つの関数の例

  template< typename T2, typename Functor>
  void GetDiagonalElements( std::vector<T2> &diag, Functor gdeFunctor)
  {
      diag.resize(1);
      gdeFunctor( data[0], diag[0] );
  }

  template<typename T2>
  void GetDiagonalElements( std::vector<T2>& diag)
  {
     GetDiagonalElements(diag, GetDiagonalElementsFunc<T2>());
  }
于 2013-03-20T12:13:38.240 に答える