如何在C++中像函数一样存储参数矩阵



我有一个矩阵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使用存储在字段中的参数调用给定坐标中的函数(如前面的示例)。但是在这种情况下,在调用之前必须设置所有需要的函数。

最新更新