It's also probably worth pointing out that you seem to know that your arrays 
are sorted, in which case you may be able to do even better than that 
implementation of findnext. It will depend entirely on whether you often skip 
many elements of x0; if not, you're much better off with the simple one.

Best,
--Tim

On Tuesday, May 26, 2015 07:38:53 AM Andrea Cimatoribus wrote:
> Wow, I definitely see the point of having a single language for libraries
> and users...
> 
> Il giorno martedì 26 maggio 2015 16:31:23 UTC+2, Mauro ha scritto:
> > The only thing I can spot is indeed the findnext function.  Higher order
> > functions are slow in Julia.  It's probably easiest if you just +/- dump
> > the code of findnext into your code:
> > 
> > julia> @edit findnext(x->x, [5.],1)
> > 
> > # returns the index of the next element for which the function returns
> > true
> > function findnext(testf::Function, A, start::Integer)
> > 
> >     for i = start:length(A)
> >     
> >         if testf(A[i])
> >         
> >             return i
> >         
> >         end
> >     
> >     end
> >     return 0
> > 
> > end
> > 
> > On Tue, 2015-05-26 at 10:54, Andrea Cimatoribus <[email protected]
> > 
> > <javascript:>> wrote:
> > > Hi all, I am very new to Julia, and I am trying it with a dive-in
> > 
> > approach,
> > 
> > > translating of a python script of mine. The results are already
> > > encouraging, since I get almost the same performance as the highly
> > > optimized numpy code with trivial Julia code (finally I can write for
> > > cycles!), but I think (because I profiled) I would gain a lot from
> > > optimizing the following linearly interpolating function:
> > > 
> > > function
> > 
> > interp1d(x::Array{Float64,1},x0::Array{Float64,1},y0::Array{Float64
> > 
> > > ,1})
> > > 
> > >     y = zeros(x)*NaN;
> > >     jj = 1
> > >     for ii in 1:length(y)
> > >     
> > >         if x0[1]<x[ii]<x0[end]
> > >         
> > >             jj = findnext(val->val>x[ii],x0,jj)-1;
> > >             y[ii] = y0[jj] +
> > 
> > (y0[jj+1]-y0[jj])/(x0[jj+1]-x0[jj])*(x[ii]-x0[
> > 
> > > jj]);
> > > 
> > >         end
> > >     
> > >     end
> > >     return y;
> > > 
> > > end
> > > 
> > > 
> > > I guess that findnext may not be the best choice, and possibly
> > > metaprogramming could help, but I am mostly new to it and I would
> > > appreciate some sort of introduction. Could someone point me to
> > 
> > resources
> > 
> > > to make progress, or do you have any suggestion?
> > > Thanks,
> > > Andrea

Reply via email to