我正在使用SimpleHypergraphs.jl库,并尝试从csv之类的文本文件构造超图。
例如,我想从csv文件加载一个超图,如下所示:
0.0, 7.0, 0.0, 0.0
1.3, 2.8, 4.5, 0.0
0.0, 1.3, 3.1, 4.2
1.2, 0.0, 5.6, 5.0using SimpleHypergraphs
using CSV
df = CSV.read("edge_weights.csv", DataFrame)
m = Matrix{Float64}(df)
h = Hypergraph(m)我收到以下错误:"ERROR: MethodError: no method matching Hypergraph(::Matrix{Float64})“
我是Julia的新手,我真的希望能有一个例子来说明我是如何做到这一点的。谢谢!
发布于 2021-05-04 05:56:49
作为Hypergraph构造函数传递的矩阵应该具有Union{Nothing, T}类型的元素,其中T是某种数值类型(例如Matrix{Union{Float64,Nothing}},而不仅仅是Matrix{Float64}。
在SimpleHypegraphs.jl中,我们使用nothing (而不是0)来表示顶点不属于超边,因为在许多超图算法/应用程序中,顶点可能属于零权重的超边。
因此,您可以使用以下代码读取文件(为了重现性,我将文件内容放入一个文本变量中):
using DataFrames, CSV, SimpleHypergraphs
txt = """0.0, 7.0, 0.0, 0.0
1.3, 2.8, 4.5, 0.0
0.0, 1.3, 3.1, 4.2
1.2, 0.0, 5.6, 5.0"""
df = CSV.read(IOBuffer(txt), DataFrame;header=0)
mat = Matrix{Union{Float64,Nothing}}(df)这个矩阵现在可以很容易地用作Hypergraph构造函数。
julia> h1 = Hypergraph(mat)
4×4 Hypergraph{Float64, Nothing, Nothing, Dict{Int64, Float64}}:
0.0 7.0 0.0 0.0
1.3 2.8 4.5 0.0
0.0 1.3 3.1 4.2
1.2 0.0 5.6 5.0但是,这可能不是您所需要的,因为零(0.0)表示顶点属于具有零权重的超边的情况:
draw(h1, HyperNetX)

因此,您可能实际上希望将零转换为nothing,以表示顶点不属于超边的情况:
h2 = Hypergraph(replace(mat, 0 => nothing))现在你得到了你想要的:
draw(h2, HyperNetX)

https://stackoverflow.com/questions/67375928
复制相似问题