【问题标题】:Is there a linspace() like method in Math.NetMath.Net 中是否有类似 linspace() 的方法
【发布时间】:2013-06-07 10:21:42
【问题描述】:

Math.Net 中是否有类似 (MatLab/Octave/numpy) 的 linspace() 函数,它接受 3 个参数(最小值、最大值、长度)并在最小值和最大值之间创建一个均匀间隔值的向量/数组?实现起来并不难,但如果已经有一个功能,我更愿意使用它。

【问题讨论】:

    标签: vb.net math.net


    【解决方案1】:

    没有一个完全像 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

    【讨论】:

      【解决方案2】:

      我检查了下面显示的代码和 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;
      
      
      
          }
      

      Code for creating a linspace function in C#

      【讨论】:

        【解决方案3】:

        我使用这段 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
        

        【讨论】:

        • 你也可以为 OP 做 VB 实现吗?
        • 我刚刚用该代码的翻译更新了原始帖子,用于 VB
        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多