具有 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 Vectors 开始,除法结果是 VectorSMA 结果不是,它是 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 的新实例是正确且符合逻辑的方式。