I saved a complex matrix to a text file, e.g. ComplexF64[1.0 + 1.0im 1.0 + 0.0im; 5.0 + 0.0im 0.0 + 0.0im]
but struggle to read it again. Is there an easy way to parse this?
Technically, you could do:
julia> eval(Meta.parse("ComplexF64[1.0 + 1.0im 1.0 + 0.0im; 5.0 + 0.0im 0.0 + 0.0im]"))
2×2 Matrix{ComplexF64}:
1.0+1.0im 1.0+0.0im
5.0+0.0im 0.0+0.0im
However, you should be aware that parsing and evaluating arbitrary code is dangerous, especially if the strings come from an untrusted source.
Depends on your goals. If you want to persist data so that it can be used later, and you don’t care about human readability, then the easiest option is to use the Serialization
library:
julia> using Serialization
julia> serialize("cpx.bin", ComplexF64[1.0 + 1.0im 1.0 + 0.0im; 5.0 + 0.0im 0.0 + 0.0im])
64
julia> deserialize("cpx.bin")
2×2 Matrix{ComplexF64}:
1.0+1.0im 1.0+0.0im
5.0+0.0im 0.0+0.0im
If, on tthe other hand, you want to preserve human readability, you can use eval
to parse the string:
julia> write("cpx.txt", string(ComplexF64[1.0 + 1.0im 1.0 + 0.0im; 5.0 + 0.0im 0.0 + 0.0im]))
60
julia> eval(Meta.parse(read("cpx.txt", String)))
2×2 Matrix{ComplexF64}:
1.0+1.0im 1.0+0.0im
5.0+0.0im 0.0+0.0im
Note that calling eval
on unsantiized strings from untrusted sources is dangerous, so only use this method if you are 100% certain that the contents of the text file are safe.
You can also just use comma-delimited text, e.g. via the DelimitedFiles
library or several other libraries:
julia> using DelimitedFiles
julia> writedlm("cpx.csv", [1.0 + 1.0im 1.0 + 0.0im; 5.0 + 0.0im 0.0 + 0.0im], ',')
julia> readdlm("cpx.csv", ',', ComplexF64)
2×2 Matrix{ComplexF64}:
1.0+1.0im 1.0+0.0im
5.0+0.0im 0.0+0.0im
These have the advantage of being more human-readable and more portable across Julia versions.
See also the discussion thread: Saving an array of complex numbers