Speeding up mapslices


I was trying to perform a matrix inversion in a 3-D array along the third dimension (more info here) and reached two possible solutions.

First solution – Manual inversion

I am not worrying too much about strange types (the inverse of Int are Float64 and so on, but it could be easily solved).

# Create example array
S = (rand(4,4,1000) + 1im .* rand(4,4,1000)) ./ sqrt(2);

# Manual inversion
function f(A)
       B = Array{eltype(A),3}(undef,size(A))
       for i in 1:size(A,3)
           B[:,:,i] = inv(A[:,:,i])
       return B
julia> @btime f($S);
    1.650 ms (5002 allocations: 5.05 MiB)

Second solution – mapslices

julia> @btime mapslices(inv,$S; dims=(1,2));
    2.192 ms (11504 allocations: 4.91 MiB)


When I use @code_warntype I see there is an Any in the second solution, which may slow things down. Apart from it, there are twice as many allocations.

Is there a way to fix this in Julia internals? Is it on purpose?


1 Like