Есть ли в Math.Net метод, подобный linspace()?

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


person Alexander Van Atta    schedule 11.06.2013    source источник


Ответы (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
person Christoph Rüegg    schedule 11.06.2013

Я использовал этот код 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
person Marcel P    schedule 16.04.2021
comment
Сможете ли вы также реализовать VB для OP? - person Anton Krug; 17.04.2021
comment
Я только что обновил исходный пост переводом этого кода для VB. - person Marcel P; 18.04.2021

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

person Niranjan Sitapure    schedule 14.04.2020