2011-07-24 32 views
4

是否有人知道一个实现的多指数算法?我正在寻找给定向量A的东西,B会使用一些快速算法计算A [i]^B [i]的乘积。多指数执行

谢谢!

+0

这看起来并不差 - 如果可能的话,如果它是基于图形的话,可以通过GPU更快地完成。 –

+1

请指定您拥有的数据类型:浮点数或大整数。计算prod(a_i^b_i)的方法在两种情况下都非常不同。 –

回答

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当然是(尽管除非这是一个图形相关的帖子,并且没有标记为这样),GPU没有多大帮助。

希望这回答你的问题:)

+2

'if'语句在很多方面都不好:)不仅它检查一些错误的条件(可能是size的意思),它试图返回而不是抛出,并且当函数具有非void返回类型时,它会尝试返回任何内容。考虑只是删除它,这只是一个示例代码。 – unkulunkulu

+0

哎呀是的,我的意思是vec1.length()!= vec2.length(),谢谢:)把它改成断言,:) –

+0

@Shaktal:即使断言也需要分号。 – TonyK

0

你试过tommath(不知道它满足你的性能要求)?它的多精度整数arith库!

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,而不是写在循环自己有一旦你知道,性能是一个问题的优势,你可以用parallel_inner_product更换inner_product算法算法由第三方库提供(或自己写一个)。