0

我目前正在为离散变量实施信念传播。

消息是函数。我需要能够使用产品和总和将它们组合起来以产生新的功能。

我目前有一个使用委托的基本实现,但我想知道是否有更好的方法来处理这个问题。我还担心这将如何使用代表进行扩展。

这是我的实现示例:

public Func<double, double> ProductFunc(List<Func<double, double>> messages)
{
    // Construct the product of the message functions
    Func<double, double> productFunc = delegate(double x)
    {
        double productValue = 1.0;
        foreach(Func<double, double> message in messages)
        {
            productValue *= message(x);
        }
        return productValue;
    };

    return productFunc;

}

有没有更有效的方法来实现这一目标?

4

1 回答 1

1

您拥有的代码是否真的按照您的意愿行事

我问,因为规范不是很清楚。您拥有的代码捕获对List<Func<double, double>>对象的引用,并返回一个委托,该委托将在调用委托Func<double, double>时枚举列表(而不是在调用您的方法时使用列表)。

也许这真的是你想要的。它与在整个例如 LINQ 中使用的延迟执行一致。但这确实意味着调用者应该要么打算更改列表将更改返回的委托的评估,要么必须非常小心不要更改列表。

相反,如果您想要实现的是捕获调用时存在的数学关系,您可能希望该方法看起来像这样:

public Func<double, double> ProductFunc(List<Func<double, double>> messages)
{
    Func<double, double> productFunc = x => 1.0;

    foreach (Func<double, double> message in messages)
    {
        Func<double, double> currentFunc = productFunc;

        productFunc = x => currentFunc(x) * message(x);
    }

    return productFunc;
}

在我看来,任何一种方式都很好。这仅取决于您实际上希望代码具有什么行为。你的问题没有足够的背景让我知道。

我也担心这将如何使用代表进行扩展

它应该可以很好地扩展。无论如何,您已经在使用代表了。以任何一种方式编写它们都不太可能导致过度的性能问题,并且在任何情况下,代码都可以按原样正确表达。如果您确实遇到了特定的性能问题,以至于代码无法满足某个客观、可衡量的性能目标,那么您可以考虑调整代码以解决该问题(并且可能在此过程中至少失去一些表现力)。

于 2015-11-25T01:19:37.700 回答