Типы с числами Math.net
Я начинаю использовать Math.net
библиотека числовых данных, и я не могу найти примеры, поэтому я сталкиваюсь с несколькими проблемами:
Чтобы сделать простой пример, у меня есть два массива double
s. Я хочу разделить одно на другое и затем вычислить скользящее среднее.
Итак, код выглядит так:
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 будет подпрыгивать назад и вперед между разными, но похожими типами.
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
это правильный и логичный путь.