【问题标题】:How to store a parametric matrix like a function in C++ [closed]如何在 C++ 中像函数一样存储参数矩阵 [关闭]
【发布时间】:2016-05-03 13:49:57
【问题描述】:

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

【问题讨论】:

  • 写一个函数double M(double t, int row, int col)不要尝试使用方括号来访问元素。
  • @n.m.你可以再详细一点吗?你的意思是我通过这个函数返回一个数组?
  • 投票结束,因为不清楚(我可以为这个问题的至少三种不同解释想到解决方案)。
  • 您可以编写一个函数,将 polys 的系数存储在两个 Matrix 中并计算 returnig Matrix 为: M(i,j) = t * (a(i,j) + t * b (i,j))
  • @James 不,我的意思是 t*(b + t * a) 而不是 a * t^2 + b * t。计算多项式是霍纳的方法(规则)。

标签: c++ matrix eigenvalue


【解决方案1】:

根据我有限的理解,您所追求的是特定点的 函数,为此,我将使用 std::function<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 */ ; }

等等

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      // 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;
      };
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2021-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          相关资源
          最近更新 更多