我有一个矩阵M,它的每个元素都依赖于一个不同二次形式的单一变量t,没有常数。
举个例子,
M[1,1] = 2t^2 + 4t
M[3,2] = t^2 - 5t
M[2,4] = -t^2 + 5t
矩阵是经过一系列计算后获得的,每个元素,或者说,t^2和t之前的系数,都是通过一系列其他函数的组合计算出来的。
我想知道如何将矩阵存储为函数M(t),这样每次我都可以调用该函数来生成具有不同t的矩阵。
谢谢!
更新:其目的是在给定不同t的情况下获得矩阵的最小特征值,所以我想我可以每次生成一个矩阵,并将其提供给特征值求解器,以获得每个t的最小特征。
根据我有限的理解,你想要的是在特定点上的函数,为此,我会使用std::function<double(double)>
(即接受一个double并返回一个doubles(结果)的函数。)我想这就是你想要的?矩阵的每个位置都可以用lambda初始化,例如
// Assume my dumb matrix is a 2d vector
vector<vector<function<double(double)>>> matrix;
matrix[1][1] = [](double t) { return /* formula for: 2t^2 + 4t */ ; }
等等。
您应该创建一个类名Matrix,并且这个类有一个只有一个参数t的构造函数。
// quadratic polynomial
class QuadPoly {
public:
QuadPoly(double _c2, double _c1, double _c0) : c2(_c2), c1(_c1), c0(_c0) {}
// ... other constructors, assignment
double operator()(double t) const {return (c2*t+c1)*t+c0;}
// ... maybe operator+ operator-, if necessary
private:
double c0, c1, c2;
};
// numerical Matrix
template<class T> class Matrix {
public:
// ... constructors, destructor, assignment
const T& operator()(int row, int col) const;
T& operator()(int row, int col);
// ... anything else
friend class QuadPolyMatrix;
private:
int nRows, nCols;
int nVals; // nRows*nCols
double* pVals; // or maybe double**
};
// matrix of quadratic polynomials
class QuadPolyMatrix : public Matrix<QuadPoly> {
public:
Matrix<double> operator() (double t) const;
};
1。功能硬编码
如果你真的需要一个矩阵对象,你可以在构造函数和函数中创建一个带有t的类,它会返回值。
class CMatrix {
public:
CMatrix( double t_ ) : t( t_ ) {}
double GetElement( int row, int col ) const {
if( row == 3 && col == 2 ) {
return t * t - t * 5;
} else if( ) ...
}
private:
double t;
};
之后可以构建CMatrix mat( t );
然后用CCD_ 3求元素。
2.更通用的变体
使函数的typedef
(它们都具有相同的签名double f( double t )
)和指向函数的指针数组。然后,您可以制作一个SetFunction
方法,该方法在给定坐标中设置一个函数,GetElement
使用存储在字段中的参数调用给定坐标中的函数(如前面的示例)。但是在这种情况下,在调用之前必须设置所有需要的函数。