Julia中加权有向网络邻接矩阵的生成

Julia中加权有向网络邻接矩阵的生成,julia,lightgraphs,Julia,Lightgraphs,我想从Julia(v0.7)中的邻接矩阵生成一个加权有向网络 到目前为止,我已经尝试: using LightGraphs using SimpleWeightedGraphs A = rand(100, 100) G = Graph(A) 但我得到了一个错误: ERROR: ArgumentError: Adjacency / distance matrices must be symmetric Stacktrace: [1] SimpleGraph{Int64}(::Array{Fl

我想从Julia(v0.7)中的邻接矩阵生成一个加权有向网络

到目前为止,我已经尝试:

using LightGraphs
using SimpleWeightedGraphs

A = rand(100, 100)
G = Graph(A)
但我得到了一个错误:

ERROR: ArgumentError: Adjacency / distance matrices must be symmetric
Stacktrace:
 [1] SimpleGraph{Int64}(::Array{Float64,2}) at /home/user/.julia/packages/LightGraphs/PPsyP/src/SimpleGraphs/simplegraph.jl:78
 [2] SimpleGraph(::Array{Float64,2}) at /home/user/.julia/packages/LightGraphs/PPsyP/src/SimpleGraphs/simplegraph.jl:72
 [3] top-level scope at none:0

到目前为止,我只看到了github()页面上的示例,它从和edgelist生成加权图。然而,我更愿意直接从邻接矩阵生成图形。

绝对不是Julia图形专家,但我认为您需要的是

julia> A = rand(100,100);

julia> G = SimpleWeightedDiGraph(A)
{100, 10000} directed simple Int64 graph with Float64 weights
图形(a::AbstractMatrix)
是无向(单位加权)图形的构造函数:


根据crstnbr的答案,一个
图是一个未加权的无向图,因此邻接矩阵与
[0,1]
中的值理想地对称
图形
构造函数馈送任何对称矩阵都会为每个非零元素创建边:

A = rand(3,3);
Graph(A+A');
println.(edges(G));
 Edge 1 => 1
 Edge 1 => 2
 Edge 1 => 3
 Edge 2 => 2
 Edge 2 => 3
 Edge 3 => 3
SimpleWeightedDiGraph
具有多个构造函数,这些构造函数可以采用密集或
sparsematricxcsc
邻接矩阵:

SimpleWeightedDiGraph(rand(4,4))
 {4, 16} directed simple Int64 graph with Float64 weights

SimpleWeightedDiGraph(rand([0,1], 3, 3))
 {3, 5} directed simple Int64 graph with Int64 weights

using SparseArrays
SimpleWeightedDiGraph( sprand(3, 3, 0.5) )
 {3, 5} directed simple Int64 graph with Float64 weights

您遇到的第一个问题是随机邻接矩阵不是对称的,这是无向图所必需的。您想要创建一个有向图

其次,如果需要加权图,则需要使用
SimpleWeightedGraphs.jl
包,这意味着您只需

julia> using LightGraphs, SimpleWeightedGraphs

julia> a = rand(100,100);

julia> g = SimpleWeightedDiGraph(a)
{100, 10000} directed simple Int64 graph with Float64 weights
但是请注意,这是创建随机加权图的一种非常糟糕的方法,因为
rand
函数几乎保证这将是一个完整的图。更好的方法是使用
sprand

julia> using SparseArrays

julia> a = sprand(100, 100, 0.2);

julia> g = SimpleWeightedDiGraph(a)
{100, 2048} directed simple Int64 graph with Float64 weights
julia> using SparseArrays

julia> a = sprand(100, 100, 0.2);

julia> g = SimpleWeightedDiGraph(a)
{100, 2048} directed simple Int64 graph with Float64 weights