Типы с числами Math.net

Я начинаю использовать Math.net библиотека числовых данных, и я не могу найти примеры, поэтому я сталкиваюсь с несколькими проблемами:

Чтобы сделать простой пример, у меня есть два массива doubles. Я хочу разделить одно на другое и затем вычислить скользящее среднее.

Итак, код выглядит так:

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, результат деления Vector и SMA результат не, это IEnumerable<double>,

Итак, теперь, если я хочу включить этот результат в большее количество функций, например, умножить его на другой массив, я не смогу. Я должен восстановить Vector из результата.

Я как-то делаю это неправильно? Я не могу представить, что API будет подпрыгивать назад и вперед между разными, но похожими типами.

1 ответ

Решение

Вы делаете это правильно. Вот как MathNet разработан. Например, var R = VD1 / VD2; звонки

// Summary: Pointwise divides two Vectors.
public static Vector<T> operator /(Vector<T> dividend, Vector<T> divisor);

и возвращается Vector<T>,

var SMA = R.MovingAverage(15); звонки

public static IEnumerable<double> MovingAverage(this IEnumerable<double> samples, int windowSize);

и возвращается IEnumerable<double>,

Вы можете позвонить MovingAverage с участием Vector<double>R, потому что Vector<double> инвентарь IEnumerable<double> и вы получаете неявное приведение. Но MovingAverage не знает, что его аргумент Vector<double>, он предназначен для возвращения IEnumerable<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 это правильный и логичный путь.

Другие вопросы по тегам