我正在尝试编写一个函数,该函数返回向量的第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”的实例与参数列表匹配。
有人知道我该如何修复一元函数?
答案 0 :(得分:1)
据我了解,您想写:
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);
}
答案 1 :(得分:0)
std::transform
不适合此处。您应该使用std::accumulate
。
同样,自C ++ 11起,您有了比std::bind1st
或std::bind2d
或std::bind
方便得多的lambda。
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);
}