I have an expression of an M-element Array{Float64, 1}, and I have N points
I would like to evaluate this expression on and store the results into an
NxM Array{Float64,2}. I can get the output I want by passing the
expression to be evaluated (expr), the parametric variable (exprt), and a
vector of the time values to a function that calls @eval for each of the N
values of time, and this works fine but is a bit slow. An ideas how to
speed this up?
I'm not sure of the correct terminology but to me this is longhand for what
I view as parametric array comprehension, where you specify P ranges and
get a P+1 dim array back, instead of the regular non-parametric
comprehension where you have to specify P ranges and get a P dim array back.
function lowpass(input::Float64, lp::Float64, g::Float64)
hp::Float64 = input - lp
lp += g * hp
[lp, hp]
end
function processarrayexpr(expr, exprt, time::Vector{Float64})
len = length(time)
ret = @eval begin
$exprt = $time[1]
$expr
end
output = Array(Float64, len, length(ret))
output[1,:] = ret
for i in 1:len-1
output[i,:] = @eval begin
$exprt = $time[$i]
$expr
end
end
output
end
s = 0.0;
data = processarrayexpr(:(begin input=sin(100.0*t); [t, input,
lowpass(input, s, 0.5)] end), :(t), linspace(0.0,2.0pi,2*44100))
88200x4 Array{Float64,2}:
0.0 0.0 0.0 0.0
7.12387e-5 0.00712381 0.00356191 0.00712381
0.000142477 0.0142473 0.00712363 0.0142473
0.000213716 0.02137 0.010685 0.02137
0.000284955 0.0284916 0.0142458 0.0284916
0.000356194 0.0356118 0.0178059 0.0356118
0.000427432 0.0427302 0.0213651 0.0427302
0.000498671 0.0498465 0.0249232 0.0498465
0.00056991 0.0569601 0.0284801 0.0569601
0.000641149 0.0640709 0.0320355 0.0640709
0.000712387 0.0711785 0.0355892 0.0711785
0.000783626 0.0782824 0.0391412 0.0782824
0.000854865 0.0853824 0.0426912 0.0853824
⋮
6.2824 -0.0782824 -0.0391412 -0.0782824
6.28247 -0.0711785 -0.0355892 -0.0711785
6.28254 -0.0640709 -0.0320355 -0.0640709
6.28262 -0.0569601 -0.0284801 -0.0569601
6.28269 -0.0498465 -0.0249232 -0.0498465
6.28276 -0.0427302 -0.0213651 -0.0427302
6.28283 -0.0356118 -0.0178059 -0.0356118
6.2829 -0.0284916 -0.0142458 -0.0284916
6.28297 -0.02137 -0.010685 -0.02137
6.28304 -0.0142473 -0.00712363 -0.0142473
6.28311 -0.00712381 -0.00356191 -0.00712381
0.0 0.0 0.0 0.0