【问题标题】:Generating a weighted and directed network form adjacency matrix in Julia在 Julia 中生成加权和有向网络形式的邻接矩阵
【发布时间】:2018-09-19 07:44:26
【问题描述】:

我想从 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 (https://github.com/JuliaGraphs/SimpleWeightedGraphs.jl) 页面上的示例,该示例从边缘列表生成加权图。但是,如果我可以直接从邻接矩阵生成图形,我会更喜欢。

【问题讨论】:

    标签: julia lightgraphs


    【解决方案1】:

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

    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 有几个构造函数,可以采用密集或SparseMatrixCSC 邻接矩阵:

    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
    

    【讨论】:

      【解决方案2】:

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

      julia> A = rand(100,100);
      
      julia> G = SimpleWeightedDiGraph(A)
      {100, 10000} directed simple Int64 graph with Float64 weights
      

      Graph(a::AbstractMatrix) 是无向(单位加权)图的构造函数:

      julia> A = A+transpose(A); # making A symmetric
      
      julia> G = Graph(A)
      {100, 5050} undirected simple Int64 graph
      
      julia> weights(G)
      100 × 100 default distance matrix (value = 1)
      

      【讨论】:

        【解决方案3】:

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

        其次,如果你想要一个加权图,你会想要使用 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 2020-02-04
          • 1970-01-01
          相关资源
          最近更新 更多