In my test the allocations are reduced to 250 Mb:
17.909110 seconds (616.27 k allocations: 256.346 MiB, 1.37% gc time)
This is the code:
using LinearAlgebra
function symplectic(N,G,R)
for i in 0:N-1
for j in 0:N-1
@. R = randn()
@inbounds G[2*i + 1,2*j + 1] = R[1] + R[2]*im
@inbounds G[2*i+1 + 1,2*j+1 + 1] = R[1] - R[2]*im
@inbounds G[2*i+1 + 1,2*j + 1] = -R[3] + R[4]*im
@inbounds G[2*i + 1,2*j+1+ 1] = R[3] + R[4]*im
end
end
ev = svdvals!(G)
return ev[2*N]*N
end
function data(n,samples)
G = Array{Complex{Float64}}(undef, 2n ,2n)
R = zeros(4)
for i in 1:samples
println(symplectic(n,G,R))
end
end
n = 100
samples = 1000
data(n,samples)
@time data(n,samples)
And the difference (to 2Gib) is using svdvals!
(note the exclamation mark)
Edit: I am not sure if this is doing the same as your code, exactly. But appropriate use of adjoint!
and mul!
could reduce the allocations even further.