c# – 使用表达式树构建Func多项式

c# – 使用表达式树构建Func多项式,第1张

概述TL; DR 如何使用系数数组构建表达式并将其转换为Func< int,double>?有比表达树更好的方法吗? 我有一个不可变的序列类型,使用Func< int,double>构造用于为序列A生成术语An的公式.我开始构建一个辅助类,用一些简单的参数构造常见的数学公式: public static Sequence CreateLinearSequence (double m, double b TL; DR

如何使用系数数组构建表达式并将其转换为Func< int,double>?有比表达树更好的方法吗?

我有一个不可变的序列类型,使用Func< int,double>构造用于为序列A生成术语An的公式.我开始构建一个辅助类,用一些简单的参数构造常见的数学公式:

public static Sequence CreatelinearSequence (double m,double b){ return new Sequence (n => m * n + b); }

我为常量序列,对数和简单多项式(线性,二次,三次和四次)构建了标准方法,但我想使用params关键字扩展它以支持任意数量的项.

这是我的方法:

public static Sequence CreatepolynomialSequence (params double[] coeff) {     Expression<Func<int,double>> e = x => 0;     double pow = 0;     for (int i = coeff.Length - 1; i >= 0; i--)     {         double c = coeff[i];         var p = Expression.Parameter (typeof (int),"x");         e = Expression.Lambda<Func<int,double>> (             Expression.Add (                 e,(Expression<Func<int,double>>)(x => c * Math.Pow (x,pow))             ),p);         pow++;      }     return new Sequence (e.Compile ()); }

对你们这些人来说,我做错了可能是显而易见的;我搞砸了一下,直到我得到了一些我觉得应该工作的东西,但事实并非如此.

目标是使序列像这样工作一个数组double [] coeff = {a,b,c,d,e,f,g,h}

x => h gx fx ^ 2 ex ^ 3 dx ^ 4 cx ^ 5 bx ^ 6 ax ^ 7使用适当的Math.Pow(x,exponent)调用.

运行

var s2 = SequenceHelper.CreatepolynomialSequence (new[] { 1d,2 });Console.Writeline ("s2: " + s2);

结果是

Unhandled Exception: system.invalIDOperationException: The binary
operator Add is not defined for the types
‘System.Func2[system.int32,System.Double]' and
'System.Func
2[system.int32,System.Double]’. at
System.linq.Expressions.Expression.GetUserdefinedBinaryOperatorOrThrow
(ExpressionType binaryType,System.String @R_419_6889@,
System.linq.Expressions.Expression left,
System.linq.Expressions.Expression right,Boolean liftToNull)
[0x0004a] in
/private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs:658
at System.linq.Expressions.Expression.Add
(System.linq.Expressions.Expression left,System.Reflection.MethodInfo
method) [0x00057] in
/private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs:1409
at System.linq.Expressions.Expression.Add
(System.linq.Expressions.Expression left,
System.linq.Expressions.Expression right) [0x00000] in
/private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs:1390
at Sequence.SequenceHelper.CreatepolynomialSequence (System.Double[]
coeff) [0x00110] in
/Users/Knoble/Monoprojects/Sequences/Sequence/SequenceHelper.cs:88
at Sequence.Test.Main () [0x0001f] in
/Users/Knoble/Monoprojects/Sequences/Sequence/Test.cs:53 [ERROR]
FATAL UNHANDLED EXCEPTION: system.invalIDOperationException: The
binary operator Add is not defined for the types
‘System.Func2[system.int32,
System.linq.Expressions.Expression right) [0x00000] in
/private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs:1390
at Sequence.SequenceHelper.CreatepolynomialSequence (System.Double[]
coeff) [0x00110] in
/Users/Knoble/Monoprojects/Sequences/Sequence/SequenceHelper.cs:88
at Sequence.Test.Main () [0x0001f] in
/Users/Knoble/Monoprojects/Sequences/Sequence/Test.cs:53 The
application was terminated by a signal: SIGHUP

解决方法 我对问题和所有三个答案感到困惑;如果您打算将它们编译成委托,那么为什么要搞乱表达式树呢?直接返回代表!

public static Func<double,double> CreatepolynomialFunction (params double[] coeff){    if (coeff == null) throw new ArgumentNullException("coeff");    return x =>     {        double sum = 0.0;        double xPower = 1;        for (int power = 0; power < coeff.Length; power += 1)        {            sum += xPower * coeff[power];            xPower *= x;        }        return sum;    };}

完成.不要乱用表达树.

(我注意到我假设数组中的第n个项目是第n个系数;显然你在数组中向后列出你的系数.这似乎容易出错,但是如果这就是你想要的那么那么修改这个答案并不困难将循环从Length-1运行到零.)

总结

以上是内存溢出为你收集整理的c# – 使用表达式树构建Func多项式全部内容,希望文章能够帮你解决c# – 使用表达式树构建Func多项式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223992.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)