我正在尝试编写一个函数,它返回向量的第n个范数,其中n在函数的输入中。
double n_norm = N_Norm(std::vector< double > x, double n);
我正在尝试使用std :: transform方法和std :: pow来计算输入向量中所有元素的n次幂。
return (std::pow(std::transform(x.begin(), x.end(), x.begin(), std::bind2nd(std::pow<double>(), n)), 1/n));
但我得到这个错误:
没有重载函数“std :: pow”的实例与参数列表匹配。
任何人都知道如何修复我的一元功能?
据我了解,你想写:
double N_Norm(std::vector<double> v, double n)
{
std::transform(v.begin(), v.end(), [n](double d) { std::pow(d, n); });
double sum = std::accumulate(v.begin(), v.end(), 0.);
return std::pow(sum, 1 / n);
}
但那是矢量的额外副本。
在c ++ 17中,您可以:
double N_Norm(std::vector<double> v, double n)
{
return std::pow(std::transform_reduce(v.begin(),
v.end(),
0.,
std::plus<>{},
[n](double d){ return std::pow(d, n); }),
1 / n);
}
std::transform
不适合这里。你应该使用std::accumulate
。此外,从C ++ 11开始,你有lambda,它比std::bind1st
或std::bind2d
或std::bind
更方便。
double N_NormAcc(const std::vector< double > &v, double n) {
auto sum = std::accumulate(v.begin(), v.end(), 0.0, [n](auto sum, auto x) {
return sum + std::pow(std::fabs(x), n);
});
return std::pow(sum, 1.0 / n);
}