材料:
行列要素タイプでテンプレート化された行列クラス。サブ行列やダブル/フロートなどで機能することを目的としています。
「真の」対角線を返す行列メンバーメソッド。つまり、NxNの場合、それらの対角線、つまりサイズNのベクトルのベクトルを部分行列化します。
サブマトリックスの実装に関する制限をできるだけ少なくし、サブマトリックスを使用しない場合の不要な「副作用」/要件はありませんが、たとえば2倍にします。
いくつかのアルゴリズムでの行列クラスのシームレスな使用。たとえば、共役勾配法。理想的には、いくつかの一般的な行列型とベクトル型でテンプレート化する必要があります。
アイデアは、行列の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を指定したい場合はどうすればよいですか?