C++ C+;中是否有等效的Polyval(Matlab';s函数)+;STL?

C++ C+;中是否有等效的Polyval(Matlab';s函数)+;STL?,c++,matlab,polynomials,polynomial-math,C++,Matlab,Polynomials,Polynomial Math,我需要计算某种程度的多项式(一维)(=0;deg--,I++) { 结果+=系数[i]*标准::功率(val,deg); } 结果。推回(结果); } 返回结果; } int main() { 向量系数={4,2,-2,5}; std::vector valuesToEvaluate={0,2,-4}; 标准::向量结果=多值(系数,值评估); 用于(自动常数和恢复:结果) { std::cout正如我现在使用Horner方法的评论中所建议的,基于多项式求值的Boost实现,主要区别是: 多项式

我需要计算某种程度的多项式(一维)(=0;deg--,I++) { 结果+=系数[i]*标准::功率(val,deg); } 结果。推回(结果); } 返回结果; } int main() { 向量系数={4,2,-2,5}; std::vector valuesToEvaluate={0,2,-4}; 标准::向量结果=多值(系数,值评估); 用于(自动常数和恢复:结果) {
std::cout正如我现在使用Horner方法的评论中所建议的,基于多项式求值的Boost实现,主要区别是:

  • 多项式阶数-在这个解决方案中,和Matlab一样,最高多项式阶数是第一位的。 e、 g:
    p(x)=4x^3+2*x^2-2*x+5
    表示为
    向量
    ,如下
    {4,2,-2,5}

  • 计算多个值


  • 对于初学者,您可以删除
    std::pow
    ,并在运行过程中积累
    x
    的能力。有关此方法的名称,请参见下一条注释:Use。这能帮助您实现此目的吗?除非您的应用程序的运行时间上限为微秒,否则我认为优化简单for循环不会产生任何影响“过早优化是万恶之源”从0度开始,积累价值的力量。根本不需要使用
    std::pow()
    。@AnderBiguri-我添加了性能指标,如果你也测试它,请分享。我指的是实际结果(毫秒)“,但我想这没关系。@AnderBiguri编辑,这平均会破坏上述计算10次。”。
    #include<iostream>
    #include<vector>
    #include<math.h>
    
    std::vector<double> Polyval(std::vector<double> coeffs, std::vector<double> values)
    {
      std::vector<double> results;
        for (auto const &val:values)
            {
              double result = 0;
              for (int i = 0, deg = coeffs.size() - 1; deg >= 0; deg--, i++)
                {
                    result += coeffs[i] * std::pow(val, deg);
                }
              results.push_back (result);
            }
            return results;
    }
    
    int main()
    {
      std::vector<double> coeffs = { 4, 2, -2, 5};
      std::vector<double> valuesToEvaluate = { 0, 2 , -4};
      std::vector<double> results = Polyval (coeffs, valuesToEvaluate);
    
      for (auto const &res:results)
        {
          std::cout << res << std::endl;
        }
    }
    
    #include<assert.h>
    #include<vector>
    
    std::vector<double> Polyval(std::vector<double> coeffs, std::vector<double> values)
    {
      assert(coeffs.size() > 0);
      std::vector<double> results;
      for (auto const &val:values)
      {
          double result = coeffs[0];
          for (int i = 1; i < coeffs.size(); i++)
            {
                result *= val;
                result += coeffs[i];
            }
            results.push_back (result);
        }
        return results;
    }
    
    #include<iostream>
    #include<assert.h>
    #include<vector>
    #include<chrono>
    
        int iter = 10000;
        std::vector<double> coeffs = { 4, 2, -2, 5, 0, 15};
        std::vector<double> valuesToEvaluate = {0, 2, -4, 8, 15, 1.25, 512 ,-5.3 
        ,12.215, 153, 23, -11};
        auto start = std::chrono::high_resolution_clock::now();
    
        do{
        std::vector<double> results = Polyval(coeffs, valuesToEvaluate);
        }
        while(iter-->0);
    
        auto end = std::chrono::high_resolution_clock::now();
        long duration = std::chrono::duration_cast<std::chrono::microseconds>(end - 
        start).count();
    
        std::cout << duration << std::endl;