有没有人知道已经实现的多指数算法?我正在寻找一些使用快速算法计算给定向量A、B的乘积A[i]^B[i]的方法。
谢谢!
#include <cmath>
#include <functional>
#include <numeric>
double f(double x, double y)
{
return y * std::log(x);
}
template <typename I, typename J>
double multi_exponentiation(I a0, I an, J b0)
{
return std::exp(std::inner_product(a0, an, b0, 0., std::plus<double>(), f));
}
// Example program
int main()
{
std::vector<double> a, b;
...
double e = multi_exponentiation(a.begin(), a.end(), b.begin());
}
使用inner_product
而不是自己编写循环的好处在于,一旦您知道性能成为问题,您可以用第三方库提供的parallel_inner_product
算法替换inner_product
算法(或者自己编写一个)。
Vector VectorPower( Vector vec1, Vector vec2 )
{
assert(vec1.length() == vec2.length());
Vector vecAns( vec1.length() );
for( unsigned int i = 0; i < vec1.length(); i++ )
{
vecAns[i] = pow( vec1[i], vec2[i] );
}
return vecAns;
}
大多数情况下,这对您的应用程序来说已经足够高效了。如果您正在实现平方根或其他超越函数,则必须考虑优化。
此外,一些处理器针对任意整数幂进行了优化,GPU当然也是如此(尽管这对于非图形相关帖子并没有太大帮助,而且未被标记为此类帖子)。
希望这回答了您的问题 :)
if
语句在很多方面都是不好的 :) 它不仅检查了一些错误的条件(可能是大小),而且试图返回而不是抛出异常,并且在函数具有非void返回类型时尝试返回空值。考虑将其删除,毕竟这只是一个示例代码。 - unkulunkulu你尝试过 tommath 吗(不确定它是否符合你的性能要求)?它是一个多精度整数算术库!