In [ ]:
include("Interpolation.jl")

In [53]:
grid = [1, 2]
vals = [2, 0]


Out[53]:
2-element Array{Int64,1}:
 2
 0

In [54]:
function f(x)
    return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
end

return f


LoadError: cannot define function f; it already has a value
while loading In[54], in expression starting on line 1

In [51]:
grid = [1, 2]
vals = [2, 0]
f = my_lin_interp(grid, vals)


Out[51]:
func (generic function with 2 methods)

In [30]:
f(1.5)


Out[30]:
1.0

In [26]:
searchsortedfirst(grid, 2)


Out[26]:
2

In [25]:
searchsortedfirst(grid, 6)


Out[25]:
3

In [37]:
#Vector 入力への対応
grid = [1, 2]
vals = [2, 0]
f = my_lin_interp(grid, vals)

function my_lin_interp(grid, vals)
    function func(x::Real)
        return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
    end
   #引数 x が Vector のときは func(x::Vector) に書いてある命令が,それ以外のときは func(x) に書いてある命令が実行される 
    function func{T<:Real}(x::Vector{T})
        return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1] 
    end

    return func
end


Out[37]:
my_lin_interp (generic function with 1 method)

In [38]:
f([1.25, 1.5])


Out[38]:
2-element Array{Float64,1}:
 1.5
 1.0

In [39]:
#Type として実装
immutable MyLinInterp
    grid
    vals
end
# grid,valsからなるMyLinInterpは変更不可能なデータタイプ

In [40]:
#call(x, args...)
#If x is not a Function, then x(args...) is equivalent to call(x, args...). This means that function-like behavior can be added to any type by defining new call methods.

In [46]:
function Base.call(f::MyLinInterp, x)
    function func(x::Real)
        return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
    end

    function func{T<:Real}(x::Vector{T})
        return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
    end

    return func
end


Out[46]:
call (generic function with 1086 methods)

In [49]:
grid = [1, 2.5]
vals = [2, 0]
f = MyLinInterp(grid, vals)


Out[49]:
MyLinInterp([1.0,2.5],[2,0])

In [ ]: