【问题标题】:Calculating sums of pairwise products, triple-wise products and so on计算成对积、三重积等的总和
【发布时间】:2018-07-25 02:27:51
【问题描述】:

1) 问题表述:

给定一个长度为n的向量:a=[a1,a2,..,an],我需要计算向量b=[b1,b2,..bn],这样:

b1=a1+a2+...+an
b2=a1a2+a1a3+...+a1an+a2a3+...+a2an+...+a{n-1}an
b3=a1a2a3+a1a2a4+...+a1a2an+a1a3a4+...
...
bn=a1a2a3...an

b 的每个连续条目包含 a 的条目总和、成对积总和、三倍积等。

有没有人知道有效的算法,或者可能是实现该算法的现有库?

我在想类似的事情

b1=sum(a)
b2=a1*sum(a[1,:])+a2*sum(a[2,:])+...

对于所有其他条目也是如此。

2) 为什么我需要这个:

我想使用拉格朗日插值多项式展开来执行一维函数积分。我的问题是牛顿-科茨公式的扩展。该公式用于计算定积分。与 Newton-Cotes 不同,我想计算给定函数 f 在所选搭配点的完整反导数,因此我必须对每个拉格朗日插值多项式进行积分。

我不需要工作代码。我对算法以及这是否已经实现更感兴趣。

谢谢, 米哈伊尔

编辑:示例:

a=[1,2,3,4]

然后

b=[1+2+3+4,1*2+1*3+1*4+2*3+2*4+3*4,1*2*3+1*2*4+1*3*4+2*3*4,1*2*3*4]=[10,35,50,24]

【问题讨论】:

  • @pault,这显然是一个错字。我添加了一个示例
  • 这个例子真的很有帮助——我正要发布与@blhsing 在下面所做的相同的解决方案。

标签: python algorithm


【解决方案1】:
from functools import reduce
from itertools import combinations
from operator import mul
a = [1, 2, 3, 4]
print([sum(reduce(mul, c) for c in combinations(a, i + 1)) for i in range(len(a))])

这个输出:

[10, 35, 50, 24]

【讨论】:

  • @pault,据我记得,建议在接受任何答案之前等待 1-2 天:首先,提供的答案(理论上)可能是错误的,其次,更优雅/更快可以出现解决方案。尽管我怀疑这里的情况是否如此,但我通常更愿意在接受任何答案之前等待
【解决方案2】:

为了完整起见,我想建议我自己使用递归的替代解决方案。很容易注意到,如果对于某些 a=[a1,a2,...,an] 我们知道 b=[b1,b2,...bn],而不是对于向量 a'=[a1,a2,...,an,a{n+1}](这样第一个 n 项与向量 a 重合),解决方案将是:

b'=[b1+a{n+1},b2+b1*a{n+1},b3+b2*a{n+1},...,b{n}+b{n-1}*a{n+1},b{n}*a{n+1}]

因此,基于递归的解决方案很简单:

def f2(a):
if len(a)==1:
    return a
else:
    return np.append(f2(a[:-1])+np.append([1],f2(a[:-1])[:-1])*a[-1],[a[-1]*f2(a[:-1])[-1]])

结果与上述解决方案相同,但基准测试表明@blhsing 建议的解决方案更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多