Matrix Market 或从 SuiteSparse Matrix Collection 提供 URL - 为简单起见,假设我只想考虑以“.mtx.gz”结尾的 URL。
以下是我目前拥有的代码:
using HTTP
using CodecZlib
using SparseArrays
url = "https://math.nist.gov/pub/MatrixMarket2/Harwell-Boeing/airtfc/zenios.mtx.gz" # String
data = HTTP.get(url).body # Vector{UInt8} (alias for Array{UInt8, 1})
buffer = IOBuffer(data) # IOBuffer (alias for Base.GenericIOBuffer{Array{UInt8, 1}})
stream = GzipDecompressorStream(buffer) # TranscodingStreams.TranscodingStream{GzipDecompressor, IOBuffer}
forUse = read(stream) # Vector{UInt8} (alias for Array{UInt8, 1})
# Alternative for String
# forUse = read(stream, String) # String
我遇到的问题是我只知道如何强制变量 forUse
为
Vector{UInt8}
数据类型或
String
。如果我在
sparse(forUse)
是
forUse
时尝试
Vector{UInt8}
,我会得到一堆稀疏的废话。 如果我在
sparse(forUse)
是
forUse
时尝试
String
,则会收到错误:“错误:MethodError:没有与稀疏(::String)匹配的方法”如果可能的话,我希望避免逐行读取
String
的
forUse
数据类型,因为我觉得这效率极低。问题:是否有任何有效的方法可以从
HTTP.get(url).body
# forUse defined in the question
fuse = String(forUse)
let I = Int[], J = Int[], V = Float64[]
for line in eachsplit(fuse, '\n')
length(line) == 0 && continue
line[1] == '%' && continue
(si,sj,sv) = split(line)
i = parse(Int, si)
j = parse(Int, sj)
v = parse(Float64, sv)
push!(I, i)
push!(J, j)
push!(V, v)
end
sparse(I,J,V)
end
返回一个稀疏矩阵,其中包含输入数据文件中的条目。
这似乎不太可能需要对此进行超级优化,并且此代码具有一定的清晰度。