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

时间:2016-05-03 13:49:58

标签: c++ matrix eigenvalue

我有一个矩阵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的最小特征值。

4 个答案:

答案 0 :(得分:1)

根据我有限的理解,你所追求的是特定点上的函数,为此,我会使用std::function<double(double)>(即需要一个double并返回double的函数(结果。)我想这就是你所追求的?矩阵的每个位置都可以用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 */ ; }

答案 1 :(得分:0)

你应该创建一个类名Matrix,这个类有一个只有一个参数t的构造函数。

答案 2 :(得分:0)

// 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;
};

答案 3 :(得分:0)

<强> 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 );

然后按mat.GetElement( 3, 2 );获取元素。

<强> 2。更多功能的变体。

使typedef个函数(它们都具有相同的签名double f( double t ))和函数指针数组。然后,您可以创建一个SetFunction方法,该方法在给定坐标中设置一个函数,GetElement调用函数在给定坐标中使用参数存储在字段中(如上例所示)。但在这种情况下,您必须在调用之前设置所有需要的函数。