我正在尝试将Func<MathNet.Numerics.LinearAlgebra.Vector<double>, double>
转换为Func<double[], double>
,但无法找到方法。
我需要做的原因是:我在第一种形式中得到一个参数,我必须以第二种形式传递它。基本上,我必须将Vector中的每个double值映射到double数组中的double值。
有没有办法进行这种转换,也许是用反射?
编辑:
Vector<T>
是抽象的。
DenseVector<T>
是实现Vector<T>
使用double[]
初始化矢量初始化:
new DenseVector(new double [] { });
答案 0 :(得分:2)
如果阵列很大并且从中创建Vector
是很昂贵的,这可能不是一个好的解决方案,但它很容易找到它。
最好只用double[]
重写一大块Vector<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类型转换为另一种lambda类型的未来并不多,但您可以随时使用适当的转换或转换代码进行一次调用。
如果你需要同样“转换”Vector<double>
lambdas数组,这应该可行:
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();