Math.Net中是否有函数(MatLab / Octave / numpy)的linspace(),它有3个参数(min,max,length)并创建一个介于min和max之间的均匀间隔值的向量/数组?这并不难实现,但如果已经有功能,我宁愿使用它。
答案 0 :(得分:4)
没有完全像linspace,但信号发生器非常接近并创建一个数组:
SignalGenerator.EquidistantInterval(x => x, min, max, len)
我对VB.net语法不是很新鲜,但我猜它与C#非常接近。
如果您需要矢量:
new DenseVector(SignalGenerator.EquidistantInterval(x => x, min, max, len))
或者你可以实现它,例如使用静态创建功能(实际上你可能想要预先计算步骤):
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
答案 1 :(得分:1)
我使用这个 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
答案 2 :(得分:0)
我检查了下面显示的代码和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;
}