当节点是集合而不是数字或规范符号时,这个问题涉及Mathematica 8中的图形对象。
我尝试做的只是以下几点。我有一套套装。请考虑以下事项:
S = {{1}, {2}, {1,2}, {2,3}} (* Set of vertices *)
E = {{{1}, {2}}, {{2}, {1,2}}, {{{1,2}, {2,3}}, {{2,3}, {1}}} (* Edges *)
不幸的是,当我执行以下操作时:
Graph[S, E]
Mathematica不会创建图形对象,也无法理解我打算创建一个具有节点集的图形。
我能做些什么才能达到这个效果?我想了一些替换只是为了让Mathematica了解如何创建连接,使用反转我可以在创建图形后标记顶点。但不知道如何得到这个。
我尝试使用替换规则和运算符,但主要的难点是操作替换任意长度的数组。我会解释自己。
考虑拥有像S
这样的列表的通用列表。用{1,2,3} -> "123"
或{2,3} -> "23"
等字符串替换它没有问题。
问题是替换运算符/.
没有提供以我想要的方式指定列表的语法。
三江源
答案 0 :(得分:3)
你永远不想为变量名使用大写字母,尤其是E
是邪恶的,因为它是欧拉数。另外,我认为您在E
的大括号中输入了内容。
如果我理解这是正确的,那么您唯一要做的就是从DirectedEdge
列表中提出E
:
s = {{1}, {2}, {1, 2}, {2, 3}} (*Set of vertices*)
e = {{{1}, {2}}, {{2}, {1, 2}}, {{1, 2}, {2, 3}}, {{2, 3}, {1}}} (*Edges*)
Graph[s, DirectedEdge @@@ e, VertexLabels -> "Name", ImagePadding -> 10]
答案 1 :(得分:2)
这可以说是@ halirutan方法的更具可读性的版本:
a = {1}; b = {2}; c = {1, 2}; d = {2, 3}
Graph[{a -> b, b -> c, c -> d, d -> a}, VertexLabels -> "Name",
ImagePadding -> 10]
因为它是一个连通图,所以你不需要在Graph
中包含顶点列表;边列表就足够了。
答案 2 :(得分:1)
让我解释一下:
考虑拥有像S这样的列表的通用列表。我没有 用{1,2,3}之类的字符串代替它的问题 - > “123”或 {2,3} - > “23”。
问题是更换操作员/。不提供语法 以我想要的方式指定列表。
从:
开始lists = {{{2}, {1, 2}}, {{1, 2}, {2, 3}}, {{1, 2, 3}, {1}}};
以下是几个选项:
lists /. x : {__Integer} :> StringJoin@Riffle[ToString /@ x, "-"]
{{"2", "1-2"}, {"1-2", "2-3"}, {"1-2-3", "1"}}
lists /. x : {__Integer} :> ToString@x
{{"{2}", "{1, 2}"}, {"{1, 2}", "{2, 3}"}, {"{1, 2, 3}", "{1}"}}
Map[StringJoin[ToString /@ #] &, lists, {-2}]
{{"2", "12"}, {"12", "23"}, {"123", "1"}}