如何在Mathematica 8中以编程方式访问关于“Graph”对象的信息?

7

我正在尝试在Mathematica 8中访问Graph对象内的信息。由于某种原因,Part命令似乎无法正常工作。

myGraph是我想要访问的对象。

下面的第一行显示了我的Graph对象。其他行用于检查它。

myGraph

myGraph // FullForm  
myGraph // InputForm  
myGraph // OutputForm    
myGraph[[1]]
myGraph[[2]]  

myGraph

为什么myGraph[[1]]不能返回List[1,3,4,2,5]? (我检查了两层级别,以防万一Graph被某些隐藏的包装器包裹。 Level [myGraph,1] 只返回{}。 而FullForm [myGraph] [[1]] 返回图形本身的图片。

我一定是忽略了一些显而易见的东西。


编辑

这是我用来产生图形的代码。 其中大部分与手头的问题无关。 但至少您将使用我正在使用的相同代码。

ClearAll[edges, compatibleQ, adjacentCourses, g];
edges[w_, b_] := 
 Most /@ Accumulate /@ 
   Flatten[Permutations[#] & /@ IntegerPartitions[w, All, b], 1]

compatibleQ[j_, k_, edg_] := 
 If[Intersection[edg[[j]], edg[[k]]] == {}, {j, k}, False]

adjacentCourses[edg_] := 
 Module[{len = Length[edg]},
  Cases[Flatten[Table[compatibleQ[j, k, edg], {j, len}, {k, j, len}], 
    1], {v_, w_} :>  v \[UndirectedEdge] w]]

myGraph =  Graph[adjacentCourses[edges[9, {2, 3}]], VertexLabels -> "Name", 
ImagePadding -> 10]

David,我认为将你的“结语”作为答案发布比放在问题正文中更合适(特别是放在顶部)。 - Mr.Wizard
3个回答

8

尽管看起来如此,Mathematica 8中引入的图形对象并不是“正常”的符号表达式。下面的SO问题详细讨论了这个问题和其他类似的问题,包括提取图形定义部分的方法:

Mathematica 8.0中的新图形


谢谢。我很惭愧地说,我之前读过关于开箱即用功能的内容,但完全忘记了它们以及Graph的新工作方式。你在SO链接中发布的答案提出了一些值得了解的额外问题。 - DavidC
8
将图形设计成原子的,使其结构不透明且难以符号化操作,这个决定对我来说似乎很有问题。这似乎削弱了该语言(非正式)的原则。我最喜欢的一些关于mma的东西是它是可hack的和一致的,并且许多内部细节都是暴露的。如果这个图形决策是出于提高效率的目的,我不认为这是一个好的方法。我更喜欢看到Mathematica编译器的扩展,以编译更大的符号代码子集,以及使用它实现的图形。这是我的两分钱。 - Leonid Shifrin
@Leonid 我同意。你认为 WR 会在进一步发展并逐步取代 Combinatorica 后开放它吗? - DavidC
1
@David 我认为图表背后的一般思想不会很快改变(它们将保持原子等)。也许,它们仍然会变得更加开放,我不知道。此外,我实际上没有充分利用新的图表功能,因此对此事并没有非常明确的意见。我在之前的评论中表达的是基于最初的印象,而不是基于广泛的经验。 - Leonid Shifrin

5
这可能对你有用,回答这个问题:“如何以编程方式访问Mathematica 8中的'Graph'对象的信息?”这里列出了一些新函数,用于获取有关图形的信息,如此处所列http://reference.wolfram.com/mathematica/guide/GraphRepresentation.html。在您的示例中,您似乎想要按正确顺序列出图形的顶点列表。函数VertixList似乎可以做到这一点。以下是来自文档中“属性和关系”部分的屏幕截图:

谢谢。我完全忽略了VertexList - DavidC

5
原来对于我的问题有一些简单的答案。 Graph 的文档包含了从 Graph 对象中检索信息的几种方式。(我太粗心了没有去查阅)在我看来,最有用的命令是:
VertexList[]
VertexCount[]
EdgeList[]
EdgeCount[]
EdgeRules[] 
VertexIndex[]
EdgeIndex[]
PropertyValue[]

我们需要在操作图形对象后获取信息。我可以轻松地找到我构建的图中输入的信息,但如果输出了派生图形(例如来自NeighborhoodGraph),我将不知道它的属性,除非进行探查。
感谢@dbJohn提供的Wolfram文档链接。
特别感谢@WReach在以前的SO讨论中提供关于Graph对象的评论链接his comments

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接