是否有人知道实现的多指数算法?我正在寻找一些给定矢量A,B将使用一些快速算法计算A [i] ^ B [i]的乘积的东西。
谢谢!
答案 0 :(得分:2)
以下假设您的数据是浮点数。如果您有多精度整数,请指定您的要求。
干净的数字方式当然是先记录日志。实际上,即使结果是有限的,部分产品也很容易被溢出/溢出。
惯用的对应C ++程序是:
#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
代替自己编写循环的优势在于一旦您知道性能是一个问题,就可以用{{1}替换inner_product
算法由第三方库提供的算法(或自己编写)。
答案 1 :(得分:0)
这有多快?根据算法的大小,幂函数不应该是一个瓶颈。
您可以编写一个简单的函数,如下所示:
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肯定是(虽然这没有多大帮助,除非这是一个与图形相关的帖子,并且没有标记为这样)。
希望这能回答你的问题:)
答案 2 :(得分:0)
您是否尝试过tommath(不确定它是否符合您的性能要求)?它的多精度整数arith库!