Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 防止Mathematica 8中图形[]对象的自动布局_Wolfram Mathematica_Mathematica 8 - Fatal编程技术网

Wolfram mathematica 防止Mathematica 8中图形[]对象的自动布局

Wolfram mathematica 防止Mathematica 8中图形[]对象的自动布局,wolfram-mathematica,mathematica-8,Wolfram Mathematica,Mathematica 8,在Mathematica中,某些类型的对象具有特殊的输入/输出格式。这包括图形、光栅图像,以及从Mathematica 8开始的图形(图形[])。不幸的是,大型图形可能需要很长时间才能可视化,这比我在交互工作中对它们执行的大多数其他操作要长得多 如何防止以标准形式和传统形式自动布局图形[]对象,并将其显示为例如-Graph-,最好保留输出的可解释性(可能使用解释?)。我认为这将涉及以某种方式更改格式和/或Makebox,但我没有成功地使其发挥作用 我希望以可逆的方式执行此操作,并且最好定义一个函

在Mathematica中,某些类型的对象具有特殊的输入/输出格式。这包括
图形
、光栅图像,以及从Mathematica 8开始的图形(
图形[]
)。不幸的是,大型图形可能需要很长时间才能可视化,这比我在交互工作中对它们执行的大多数其他操作要长得多

如何防止以标准形式和传统形式自动布局
图形[]
对象,并将其显示为例如
-Graph-
,最好保留输出的可解释性(可能使用
解释
?)。我认为这将涉及以某种方式更改
格式
和/或
Makebox
,但我没有成功地使其发挥作用

我希望以可逆的方式执行此操作,并且最好定义一个函数,当应用于
graph
对象时,该函数将返回原始交互式图形显示(与
GraphPlot
不同,它不是交互式的)

请注意,是否有方法检索与某些符号关联的格式/生成框定义
FormatValues
是一个相关函数,但对于
Graph
,它是空的

示例会话:

In[1]:= Graph[{1->2, 2->3, 3->1}]
Out[1]= -Graph-

In[2]:= interactiveGraphPlot[%] (* note that % works *)
Out[2]= (the usual interactive graph plot should be shown here)

虽然我没有Mathematica 8来尝试这一点,但有一种可能性是使用此结构:

Unprotect[Graph]

MakeBoxes[g_Graph, StandardForm] /; TrueQ[$short] ^:= 
 ToBoxes@Interpretation[Skeleton["Graph"], g]

$short = True;
之后,
图形
对象应以骨架形式显示,设置
$short=False
应恢复默认行为

希望这能自动切换:

interactiveGraphPlot[g_Graph] := Block[{$short}, Print[g]]

马克对修改<代码>图< /代码>的关注使我考虑使用<代码> $PREPMENT/<代码>的选项。我认为这也应该防止缓慢的布局步骤发生。如果您还没有将

$PrePrint
用于其他用途,则可能更可取

$PrePrint = 
  If[TrueQ[$short], # /. _Graph -> Skeleton["Graph"], #] &;

$short = True
同样方便的是,至少使用
图形
(同样,我无法在v7中使用
图形
进行测试),您只需使用
打印
即可获得图形。如图所示:

g = Plot[Sin[x], {x, 0, 2 Pi}]

(*  Out =  <<"Graphics">>  *)

我保留了
$short
测试,以便通过全局符号轻松切换,但您可以将其删除并使用:

    $PrePrint = # /. _Graph -> Skeleton["Graph"] &;

然后使用
$PrePrint=。
重置默认功能。

您是否尝试过简单地抑制输出?如果您这样做的话,我认为V8的
Graph
命令不会做任何布局。为了探索这一点,我们可以生成一个大的边列表,并比较
graph[edges]的计时
图形[边]
图形地块[边缘]

In[23]:= SeedRandom[1];
edges = Union[Rule @@@ (Sort /@ 
      RandomInteger[{1, 5000}, {50000, 2}])];

In[25]:= t = AbsoluteTime[];
graph[edges];

In[27]:= AbsoluteTime[] - t

Out[27]= 0.029354

In[28]:= t = AbsoluteTime[];
Graph[edges];

In[30]:= AbsoluteTime[] - t

Out[30]= 0.080434

In[31]:= t = AbsoluteTime[];
GraphPlot[edges];

In[33]:= AbsoluteTime[] - t

Out[33]= 4.934918
惰性
graph
命令当然是最快的。
Graph
命令花费的时间更长,但没有
GraphPlot
命令长。因此,在我看来,
Graph
实际上并不像
GraphPlot
那样计算布局

合乎逻辑的问题是,什么是
Graph
花费它的时间。让我们在一个简单的例子中检查
Graph
输出的
InputForm

Graph[{1 -> 2, 2 -> 3, 3 -> 1, 1 -> 4}] // InputForm

Out[123]//InputForm=
    Graph[{1, 2, 3, 4}, 
      {DirectedEdge[1, 2], 
       DirectedEdge[2, 3], 
       DirectedEdge[3, 1], 
       DirectedEdge[1, 4]}]
请注意,图的顶点已经确定,我认为这就是
graph
正在做的事情。事实上,在第一个示例中,计算
Graph[edges]
所花费的时间与我所能想到的最快的方法相当:

Union[Sequence @@@ edges]; // Timing

这花费了0.087045秒。

您可以使用
Graph
GraphLayout
选项以及图形构造函数来抑制渲染。图形仍然可以通过
GraphPlot
可视化。试试下面的方法

{gr1, gr2, gr3} = {RandomGraph[{100, 120}, GraphLayout -> None], 
  PetersenGraph[10, 3, GraphLayout -> None], 
  Graph[{1 -> 2, 2 -> 3, 3 -> 1}, GraphLayout -> None]}


为了使工作更简单,您可以使用
SetOptions
为所有感兴趣的图形构造函数将
GraphLayout
选项设置为
None

这似乎可行
interactiveGraphPlot
提供原始版本,但使用交互式功能将其还原为表单。(事实上这部分并不重要。)我应该学习
格式
makebox
如何工作,以及它们之间的区别(还有
tobox
)。例如,为什么未经修改的
makebox
不返回交互对象,
ToBoxes
返回交互对象,但是需要在这里修改
makebox
?我想我不明白你说的是什么,但是
ToBoxes
需要,因为
makebox
的输出应该是box;省略它将导致错误。默认情况下,makebox就是做(类似)tobox,除非你给它特殊的规则,比如这个。我想我不明白。在内置命令上调用
Unprotect
,使
Graph
的输出变为
-Graph-
,真的值得吗?我同意图形作为图像的输出格式是奇怪的,甚至是不幸的。问题是,正确的处理方法是什么?在我看来,简单地抑制输出应该是推荐的方法。@马克,抑制输出是自版本6以来的标准方法,我同意这通常是最好的。但是,有时直接的图形格式设置会造成阻碍。有时,如果
g
是一个
Graphics
对象,并且我有一个类似
{1,2,p,3}
的表达式,我宁愿看到
{1,2,-Graphic-,3}
而不是一个包含实际图形的列表,尤其是当它以缓慢显示为代价时。@Mr Wizard,您可能对此感兴趣:我在多年前的MathGroup上看到过这一讨论,但现在找不到这一讨论。
Graph
本身不做布局,它的交互输出做布局。这就像等待图形被渲染一样。因此,您甚至无法使用
计时
绝对计时
来测量此时间。是的,我可以抑制输出,但关键是我真的不想麻烦这样做,有时我会忘记它
{gr1, gr2, gr3} = {RandomGraph[{100, 120}, GraphLayout -> None], 
  PetersenGraph[10, 3, GraphLayout -> None], 
  Graph[{1 -> 2, 2 -> 3, 3 -> 1}, GraphLayout -> None]}