这些成分:
以矩阵元素类型为模板的矩阵类,旨在与子矩阵以及双精度/浮点数等一起使用。
返回“真实”对角线的矩阵成员方法,即在 NxN 子矩阵的情况下,它们的对角线,即大小为 N 的向量的向量。
关于子矩阵的实现尽可能少的限制,并且在不使用子矩阵时没有不必要的“副作用”/要求,例如,只是加倍。
在某些算法中无缝使用矩阵类,例如共轭梯度,理想情况下应该在一些通用矩阵和向量类型上进行模板化。
这个想法是为矩阵的 GetDiagonalElements() 方法提供一个仿函数,该方法具有一个仅复制对角元素的默认值。忽略矩阵的实际大小(仅 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”的模板参数
猜猜函子不需要模板参数 - 我试过但也没有让它工作,可能很简单(?),尽管任何帮助表示赞赏,亲切的问候,德里克。
PS:理想情况下,如果可能的话,没有额外/中间的辅助类型。没有 Boost,没有 C++11。
附加问题:如果我想做同样的事情,但将对角访问函子指定为矩阵模板声明(?)的一部分,怎么办?