On Monday, March 23, 2015 02:22:25 PM Patrick Kofod Mogensen wrote:
> I will look into that, thanks. I don't *really* care if I have three or two
> methods (or just include the one I need and have one),

Excellent. FYI Matlab has also moved to doing interpolation in two stages, see 
their griddedInterpolant class. I think it's a much cleaner separation between 
"here are the inputs" and "here is where I'd like to evaluate it."

> but I would much
> prefer to use a library (Interpolations.jl). I just wasn't able to dig out
> the non-uniform-method, and, frankly, the abstraction level of that library
> is scary to a junior technical programmer as myself :)

Understood. 1d is nice because you don't need all the metaprogramming mumbo 
jumbo; however, even there it can be convenient for supporting many different 
orders of interpolation, boundary conditions, etc. 

--Tim

> 
> Best,
> Patrick
> 
> On Monday, March 23, 2015 at 12:31:11 PM UTC+1, Tim Holy wrote:
> > - 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

Reply via email to