Есть ли в Math.Net функция, такая как (MatLab/Octave/numpy) linspace(), которая принимает 3 параметра (минимум, максимум, длина) и создает вектор/массив равномерно расположенных значений между минимумом и максимумом? Это не сложно реализовать, но если бы функция уже существовала, я бы предпочел использовать ее.
Есть ли в Math.Net метод, подобный linspace()?
Ответы (3)
Нет ни одного точно похожего на linspace, но генератор сигналов подходит очень близко и создает массив:
SignalGenerator.EquidistantInterval(x => x, min, max, len)
Я не новичок в синтаксисе VB.net, но думаю, что он очень близок к C#.
Если вам нужен вектор:
new DenseVector(SignalGenerator.EquidistantInterval(x => x, min, max, len))
Или вы можете реализовать это, например. используя статическую функцию Create (на практике вы можете предварительно вычислить шаг):
DenseVector.Create(len, i => min + i*(max-min)/(len - 1.0))
Обновление 2013-12-14:
Начиная с версии 3.0.0-alpha7 это обеспечивается двумя новыми функциями:
Generate.LinearSpaced(length, a, b)
-> МАТЛАБlinspace(a, b, length)
Generate.LinearRange(a, [step], b)
-> МАТЛАБa:step:b
Я использовал этот код C#, чтобы воспроизвести функциональность linspace (как это делает numpy), не стесняйтесь использовать его.
public static float[] linspace(float startval, float endval, int steps)
{
float interval = (endval / MathF.Abs(endval)) * MathF.Abs(endval - startval) / (steps - 1);
return (from val in Enumerable.Range(0,steps)
select startval + (val * interval)).ToArray();
}
Вот перевод VB, который я сделал.
Public Function linspace(startval As Single, endval As Single, Steps As Integer) As Single()
Dim interval As Single = (endval / Math.Abs(endval)) *(Math.Abs(endval - startval)) / (Steps - 1)
Return (From val In Enumerable.Range(0, Steps) Select startval + (val * interval)).ToArray()
End Function
Используйте примеры;
C#
float[] arr = linspace(-4,4,5)
VB
Dim arr as Single() = linspace(-4,4,5)
Результат:
-4,-2,0,2,4
Я проверил результат из кода, показанного ниже, и MATLAB linspace, он точно совпадает. Я сам использую его для своей исследовательской работы в реализациях Монте-Карло.
Ниже приведено изображение кода и фактический код.
static double[] LINSPACE(double StartValue, double EndValue, int numberofpoints)
{
double[] parameterVals = new double[numberofpoints];
double increment = Math.Abs(StartValue - EndValue) / Convert.ToDouble(numberofpoints - 1);
int j = 0; //will keep a track of the numbers
double nextValue = StartValue;
for (int i = 0; i < numberofpoints; i++)
{
parameterVals.SetValue(nextValue, j);
j++;
if (j > numberofpoints)
{
throw new IndexOutOfRangeException();
}
nextValue = nextValue + increment;
}
return parameterVals;
}
Код для создания функции linspace на C#