Julia Vector{UInt8} 到 SparseArrays.SparseMatrixCSC{Any64, Int64}

问题描述 投票:0回答:1
我正在尝试创建一个 Julia 函数,可以从

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

中提取稀疏数组,而无需将文件保存到存储中? (有关将文件下载到存储的版本,请参阅 MMGet
    

julia buffer
1个回答
0
投票

# 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

返回一个稀疏矩阵,其中包含输入数据文件中的条目。

这似乎不太可能需要对此进行超级优化,并且此代码具有一定的清晰度。

© www.soinside.com 2019 - 2024. All rights reserved.