diff --git a/src/Numerics/Interpolation/CubicSpline.cs b/src/Numerics/Interpolation/CubicSpline.cs index f31268c3..60b7d27b 100644 --- a/src/Numerics/Interpolation/CubicSpline.cs +++ b/src/Numerics/Interpolation/CubicSpline.cs @@ -523,22 +523,13 @@ namespace MathNet.Numerics.Interpolation /// int LeftSegmentIndex(double t) { - int low = 0; - int high = _x.Length - 1; - while (low != high - 1) + int index = Array.BinarySearch(_x, t); + if (index < 0) { - int middle = (low + high)/2; - if (_x[middle] > t) - { - high = middle; - } - else - { - low = middle; - } + index = ~index - 1; } - return low; + return Math.Min(Math.Max(index, 0), _x.Length - 2); } } } diff --git a/src/Numerics/Interpolation/LinearSpline.cs b/src/Numerics/Interpolation/LinearSpline.cs index 20d0fb8c..adaebc3d 100644 --- a/src/Numerics/Interpolation/LinearSpline.cs +++ b/src/Numerics/Interpolation/LinearSpline.cs @@ -202,22 +202,13 @@ namespace MathNet.Numerics.Interpolation /// int LeftSegmentIndex(double t) { - int low = 0; - int high = _x.Length - 1; - while (low != high - 1) + int index = Array.BinarySearch(_x, t); + if (index < 0) { - int middle = (low + high)/2; - if (_x[middle] > t) - { - high = middle; - } - else - { - low = middle; - } + index = ~index - 1; } - return low; + return Math.Min(Math.Max(index, 0), _x.Length - 2); } } } diff --git a/src/Numerics/Interpolation/QuadraticSpline.cs b/src/Numerics/Interpolation/QuadraticSpline.cs index 2edb7867..437a6835 100644 --- a/src/Numerics/Interpolation/QuadraticSpline.cs +++ b/src/Numerics/Interpolation/QuadraticSpline.cs @@ -157,22 +157,13 @@ namespace MathNet.Numerics.Interpolation /// int LeftSegmentIndex(double t) { - int low = 0; - int high = _x.Length - 1; - while (low != high - 1) + int index = Array.BinarySearch(_x, t); + if (index < 0) { - int middle = (low + high)/2; - if (_x[middle] > t) - { - high = middle; - } - else - { - low = middle; - } + index = ~index - 1; } - return low; + return Math.Min(Math.Max(index, 0), _x.Length - 2); } } } diff --git a/src/Numerics/Interpolation/StepInterpolation.cs b/src/Numerics/Interpolation/StepInterpolation.cs index 03c29291..7349544f 100644 --- a/src/Numerics/Interpolation/StepInterpolation.cs +++ b/src/Numerics/Interpolation/StepInterpolation.cs @@ -193,13 +193,7 @@ namespace MathNet.Numerics.Interpolation int LeftBracketIndex(double t) { int index = Array.BinarySearch(_x, t); - if (index >= 0) - { - return index; - } - - index = ~index; - return index - 1; + return index >= 0 ? index : ~index - 1; } } }