In [14]:
## utility functions missing in Julia
extract(x,v) = x[ setdiff( [1:length(x);] ,v) ]
product(x) = Int32(reducedim(*,collect(x),1)[1])
## To avoid boxing, initialize sum to the right type
z(x::AbstractFloat) = 0.0
z(x::Complex) = complex(0.0,0.0)
z(x) = 0
function colMeans(x, na_rm=true, dims=1)
dn = size(x)
id = [1:dims;]
n = product(dn[id])
dn = extract(dn,id)
pdn = product(dn)
res = zeros( pdn)
for j = 0:pdn-1
sum = z(x[1])
cnt = 0
off = j * n
for i = 1:n
v = x[i+off]
cnt += 1
sum += v
end
res[j+1] = sum/cnt
end
res
end
Out[14]:
In [16]:
function run(x,t)
for i = 1:t colMeans(x, true, 1) end
end
len = 100000
x1 = Int64[1:len;]
x1 = reshape(x1, len÷2, 2)
info(eltype(x1))
@time run(x1,1000)
In [17]:
x2 = Float64[1:len;]
x2 = reshape(x2, len÷2, 2)
info(eltype(x2))
@time run(x2,1000)
In [13]:
x4 = complex(x2)
info(eltype(x4))
@time run(x4,1000)
In [ ]: