Hello!
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])
end
return B
end
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)
Problem
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?
Thanks!