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