具有 Math.net 个数字的类型
Types with Math.net numerics
我开始使用 Math.net
数值库,但找不到示例,所以我 运行 遇到了一些问题:
举个简单的例子,我有两个 double
数组。我想一个除以另一个,然后计算移动平均数。
因此,代码如下所示:
var VD1 = Vector<double>.Build.Dense(Data1.ToArray());
var VD2 = Vector<double>.Build.Dense(Data2.ToArray());
var R = VD1 / VD2;
var SMA = R.MovingAverage(15);
问题是,在途中,数据类型发生了变化。它以 2 Vector
s 开始,除法结果是 Vector
而 SMA
结果不是,它是 IEnumerable<double>
.
所以,现在如果我想将该结果插入更多函数,例如将它乘以另一个数组,我不能。我必须根据结果重建 Vector
。
我是不是做错了什么?我无法想象 API 会在不同但相似的类型之间来回跳动。
你做得对。 这就是 MathNet
的设计方式。例如,var R = VD1 / VD2;
呼叫
// Summary: Pointwise divides two Vectors.
public static Vector<T> operator /(Vector<T> dividend, Vector<T> divisor);
和returns Vector<T>
.
var SMA = R.MovingAverage(15);
调用
public static IEnumerable<double> MovingAverage(this IEnumerable<double> samples, int windowSize);
和returns IEnumerable<double>
.
您可以使用 Vector<double>
R
调用 MovingAverage
,因为 Vector<double>
实现了 IEnumerable<double>
并且您得到 隐式转换 .但是MovingAverage
并不知道它的参数是Vector<double>
,它被设计成returnIEnumerable<double>
。
这是有道理的。据我记得在大学时,移动平均线是关于时间序列的,它与向量没有明确的关系。
但是您可以有一些解决方法。例如你自己的重载 MovingAverage
:
static class VectorHeplper
{
public static Vector<double> MovingAverage(this Vector<double> samples, int windowSize)
{
return DenseVector.OfEnumerable(samples.AsEnumerable().MovingAverage(windowSize));
}
}
那么var SMA = R.MovingAverage(15);
就是Vector<double>
.
无论如何,构建 Vector
的新实例是正确且符合逻辑的方式。
我开始使用 Math.net
数值库,但找不到示例,所以我 运行 遇到了一些问题:
举个简单的例子,我有两个 double
数组。我想一个除以另一个,然后计算移动平均数。
因此,代码如下所示:
var VD1 = Vector<double>.Build.Dense(Data1.ToArray());
var VD2 = Vector<double>.Build.Dense(Data2.ToArray());
var R = VD1 / VD2;
var SMA = R.MovingAverage(15);
问题是,在途中,数据类型发生了变化。它以 2 Vector
s 开始,除法结果是 Vector
而 SMA
结果不是,它是 IEnumerable<double>
.
所以,现在如果我想将该结果插入更多函数,例如将它乘以另一个数组,我不能。我必须根据结果重建 Vector
。
我是不是做错了什么?我无法想象 API 会在不同但相似的类型之间来回跳动。
你做得对。 这就是 MathNet
的设计方式。例如,var R = VD1 / VD2;
呼叫
// Summary: Pointwise divides two Vectors.
public static Vector<T> operator /(Vector<T> dividend, Vector<T> divisor);
和returns Vector<T>
.
var SMA = R.MovingAverage(15);
调用
public static IEnumerable<double> MovingAverage(this IEnumerable<double> samples, int windowSize);
和returns IEnumerable<double>
.
您可以使用 Vector<double>
R
调用 MovingAverage
,因为 Vector<double>
实现了 IEnumerable<double>
并且您得到 隐式转换 .但是MovingAverage
并不知道它的参数是Vector<double>
,它被设计成returnIEnumerable<double>
。
这是有道理的。据我记得在大学时,移动平均线是关于时间序列的,它与向量没有明确的关系。
但是您可以有一些解决方法。例如你自己的重载 MovingAverage
:
static class VectorHeplper
{
public static Vector<double> MovingAverage(this Vector<double> samples, int windowSize)
{
return DenseVector.OfEnumerable(samples.AsEnumerable().MovingAverage(windowSize));
}
}
那么var SMA = R.MovingAverage(15);
就是Vector<double>
.
无论如何,构建 Vector
的新实例是正确且符合逻辑的方式。