- Interpolations.jl currently only handles uniform grids, which is why it gets a Range input. Grid.jl has an undocumented non-uniform interpolation in 1d.
- You'd probably be interested in `searchsorted`. - Yes, you can simplify your interface down to 2 methods. Look at more generic functions like `similar,` `ind2sub`, etc. --Tim On Monday, March 23, 2015 02:46:37 AM Patrick Kofod Mogensen wrote: > As a part of teaching a course in economics, I had to supply Matlab code > for solving a particular kind of problem. Many times, we have to evaluate a > function outside of the grid where we know the value, and we use linear > interpolation to approximate these values. > > I wanted to use Interpolations.jl, but it seems that everything has to be > done based on x (grid where we know the function values) being a range. It > may seem weird, but I do not know from the beginning what the x's are going > to be, as the are calculated and changed throughout the algorithm. > > At some point in the algorithm, I have a matrix filled with x_i's (points > where I want to interpolate), and (x,y) which is the tuple of grids where I > know the function values and the function values themselves. My question > is, is there any way of simplifying the handling of the differences between > scalars, vector, and matrices? *(<- this is where my question is hidden in > the wall of text)* Maybe it would be easier if there was a function such as > histc to calculate loc (location aka what bin are we in). > > I probably also have to add, that it is on purpose that I treat < first > grid point and between the first and second grid point (and likewise in the > upper end) the same. If we are outside of the grid, I want to use the > nearest gradient to extrapolate. > > > function interp1 (x::Vector, y::Vector, xi::Float64) > N = length(x) > loc = zeros(m,n) > place = 1 > for i = 2:(N-1) > place+= xi[j,k] >= x[i] > end > loc=place > return y[loc]+(xi-x[loc]).*(y[loc+1]-y[loc])./(x[loc+1]-x[loc]) > end > > function interp1 (x::Vector, y::Vector, xi::Matrix) > m,n = size(xi) > N = length(x) > loc = zeros(m,n) > for k = 1:n > for j = 1:m > place = 1 > for i = 2:(N-1) > place+= xi[j,k] >= x[i] > end > loc[j,k]=place > end > end > return y[loc]+(xi-x[loc]).*(y[loc+1]-y[loc])./(x[loc+1]-x[loc]) > end > > function interp1 (x::Vector, y::Vector, xi::Vector) > n = length(xi) > N = length(x) > loc = zeros(n) > for k = 1:n > place = 1 > for i = 2:(N-1) > place+= xi[k] >= x[i] > end > loc[k]=place > end > return y[loc]+(xi-x[loc]).*(y[loc+1]-y[loc])./(x[loc+1]-x[loc]) > end
