这是我在实现的过程中遇到的一个设计问题广义分配律 https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.125.8954。假设需要自动生成如下形式的表达式
(source: yaroslavvb.com http://yaroslavvb.com/upload/sum-prod-formula.png)
总和、固定变量和“求和”变量中的项是为每个此类表达式自动生成的,并且“f”函数是单独定义的。要生成上面的表达式,我可能需要调用
sumProduct(factors,fixedVariables,fixedValues,freeVariables,freeRanges)
where
factors={{1,4},{3,4},{3,4,5}}
fixedVariables={1,3}
fixedValues={-1,9}
freeVariables={4,5}
freeRanges={Range[5],Range[6]}
该函数的输出将等于
Total[{f14[-1,1]f34[9,1]f345[9,1,1],f14[-1,2]f34[9,2]f345[9,2,1],....}]
f 项的表示可能不同,即 f[{1,4},{-1,1}] 而不是 f14[-1,1]。使用 Integer 来引用每个变量也只是一种设计选择。
谁能建议一种优雅的方法来实现 sumProduct ?
编辑 11/11Janus 的解决方案,为了可读性而重写
factors = {{1, 4}, {3, 4}, {3, 4, 5}};
vars = {{1, {-1}}, {3, {9}}, {4, Range[5]}, {5, Range[6]}};
(* list of numbers => list of vars *)
arglist[factor_] := Subscript[x, #] & /@ factor;
(* list of factors => list of functions for those factors *)
terms = Apply[f[#], arglist[#]] & /@ factors;
(* {var,range} pairs for each variable *)
args = {Subscript[x, #1], #2} & @@@ vars;
Sum[Times @@ terms, Sequence @@ args]