【问题标题】:How to convert Func<Vector<double>, double> to Func<double[], double>如何将 Func<Vector<double>, double> 转换为 Func<double[], double>
【发布时间】:2017-09-19 13:15:24
【问题描述】:

我正在尝试将Func&lt;MathNet.Numerics.LinearAlgebra.Vector&lt;double&gt;, double&gt; 转换为Func&lt;double[], double&gt;,但找不到方法。

我需要做的原因是:我得到第一种形式的参数,我必须以第二种形式传递它。基本上,我必须将 Vector 中的每个双精度值映射到双精度数组中的双精度值。

有没有办法进行这种转换,也许是反射?

编辑:

Vector&lt;T&gt; 是抽象的。

DenseVector&lt;T&gt; 是实现Vector&lt;T&gt; 的类之一

使用double[] 进行向量初始化的示例:

new DenseVector(new double [] { });

【问题讨论】:

  • 如何从double[] 创建一个MathNet.Numerics.LinearAlgebra.Vector&lt;double&gt; 并具有可接受的运行时性能(无论是什么)?我在文档中看不到任何构造函数;似乎这是一个基类或其他什么?
  • @EdPlunkett 查看我的编辑。
  • 谢谢,DenseVector 正是我要找的东西

标签: c# reflection delegates type-conversion


【解决方案1】:

如果数组很大并且从中创建Vector 的成本很高,这可能不是一个好的解决方案,但很容易找到它。

最好用Vector&lt;double&gt; 重写一大块double[] 代码,以避免一直来回转换。我对您的代码知之甚少,无法说出哪种解决方案更可取,但是如果所有这些与构造函数的混搭使您的代码陷入困境,那么这种方法是一个不错的选择。

using MathNet.Numerics.LinearAlgebra;

// ...stuff...

Func<Vector<double>, double> fv /*coming from somewhere */;

Func<double[], double> fa = (ary) => fv(new DenseVector<double>(ary));

将一种 lambda 类型转换为另一种的未来并不长,但您始终可以通过适当的转换或转换代码让另一个 调用

如果您同样需要“转换”Vector&lt;double&gt; lambda 数组,这应该可以:

Func<Vector<double>, double>[] fva /*coming from somewhere */;

Func<double[], double>[] fda = 
    fva.Select(fv => 
        new Func<double[], double>>(ary => fv(new DenseVector<double>(ary))
    ).ToArray();

或者为了省去我可怜的心智解析器:

public Func<T[], T> ConvertVectorToArrayFunc<T>(Func<Vector<T>, T> f)
    => a => f(new DenseVector<T>(a));

// ... snip ...

    Func<double[], double> fa = ConvertVectorToArrayFunc(fv);

    Func<double[], double>[] fda =
        fva.Select(ConvertVectorToArrayFunc).ToArray();

【讨论】:

  • 谢谢。还有一件事,如果我们需要转换它们的数组怎么办,即:Func&lt;Vector&lt;double&gt;, double&gt;[]Func&lt;double[], double&gt;[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2010-11-09
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2016-10-10
相关资源
最近更新 更多