C++ 有什么能帮我找到最小的乘法数吗?

C++ 有什么能帮我找到最小的乘法数吗?,c++,optimization,mathematical-optimization,multiplication,temporary,C++,Optimization,Mathematical Optimization,Multiplication,Temporary,我在做矩阵运算,最后用复杂的数学生成了可怕的数组,一个例子是: { cosine_of_yaw * cosine_of_roll, -cosine_of_roll * sine_of_yaw * sine_of_pitch - cosine_of_pitch * sine_of_roll, sine_of_pitch * sine_of_roll - cosine_of_pitch * cosine_of_roll * sine_of_yaw, cosine_of_yaw * sine_of

我在做矩阵运算,最后用复杂的数学生成了可怕的数组,一个例子是:

{ cosine_of_yaw * cosine_of_roll, -cosine_of_roll * sine_of_yaw * sine_of_pitch - cosine_of_pitch * sine_of_roll, sine_of_pitch * sine_of_roll - cosine_of_pitch * cosine_of_roll * sine_of_yaw,
  cosine_of_yaw * sine_of_roll, cosine_of_pitch * cosine_of_roll - sine_of_yaw * sine_of_pitch * sine_of_roll, -cosine_of_roll * sine_of_pitch - cosine_of_pitch * sine_of_yaw * sine_of_roll,
  sine_of_yaw, cosine_of_yaw * sine_of_pitch, cosine_of_yaw * cosine_of_pitch }
我想找到最少的乘法次数,来构造数组。这意味着,如果我发现一个乘法被重复,我需要计算它一次,并使用一个临时的。例如,我可以通过对以下任意一项进行临时处理来保存上面的1次乘法:

  • 滚动的余弦*偏航的正弦
  • 俯仰正弦*偏航正弦
  • 俯仰的余弦*偏航的正弦
  • sine\u of_roll*sine\u of_yaw
  • 比如说,我选择了1。这使我无法使用简化的
    cosine\u of_roll*cosine\u of_pitch
    。有没有办法找到乘法的最小子集

    我有很多这样的矩阵乘法,所以我希望我能把它输入到一个算法中,让它找到最小子集。我觉得这是一个NP完全问题,因为每次我选择配对时,可能的解决方案集都会发生变化。如果有人有一个聪明的解决办法,我很想看看

    如果有帮助,我使用的变量如下:

  • sine\u of_偏航
  • 偏航余弦
  • sine\u of\u pitch
  • 音高的余弦
  • sine\u of\u roll
  • 滚动的余弦

  • 在开始这项工作之前,你检查过总成了吗?很多时候,编译器会在优化过程中为您这样做。出于兴趣,减少乘法的数量真的会产生这么大的影响吗,参见(隐含)三角函数的计算?启用像快速数学或O3这样的积极优化。快速数学并不试图保持浮点运算的顺序<代码>--ffast math以gcc为例。此外,如果你想将代码顺序转换为DNA,遗传算法也可以找到它。我曾经用GA找到一个排序网络。也许GA也适用于你。@NathanOliver我怀疑编译器无法在所有情况下找到最佳子集,因为我怀疑这个问题是NP完全问题。因此,虽然我确实希望编译器会做出一个好的选择,但我怀疑它是否有能力做出最佳选择。@JonathanMee:我记得很多年前在《C语言中的数字配方》一书中读到过类似的内容,如果我没记错的话,教授们在那里谈论矩阵乘法。我想他们几乎都说他们放弃了,并遭受了额外的倍增。也许你也值得一读。