Есть ли в Math.Net метод, похожий на linspace()

Есть ли в Math.Net функция, подобная linspace () (MatLab/Octave/numpy), которая принимает 3 параметра (min, max, length) и создает вектор / массив равномерно распределенных значений между min и max? Это не сложно реализовать, но если бы уже была функция, я бы предпочел ее использовать.

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:

Начиная с v3.0.0-alpha7 это распространяется на две новые функции:

  • Generate.LinearSpaced(length, a, b) -> MATLAB linspace(a, b, length)
  • Generate.LinearRange(a, [step], b) -> MATLAB a:step:b

Я использовал этот код C# для воспроизведения функциональности linspace (как это делает numpy), не стесняйтесь его использовать. VB должен уметь делать что-то подобное.

      public static float[] linspace(float startval, float endval, int steps)
{
    float interval = (Math.Abs(startval) + Math.Abs(endval)) / (steps - 1);
    return (from val in Enumerable.Range(0,steps)
            select startval + (val * interval)).ToArray(); 
}

Я проверил результат из приведенного ниже кода и 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#

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