2011-05-09 18 views
6

'un otomatik düzenini önleyin Bazı nesne türleri Mathematica'da özel giriş/çıkış biçimlendirmesine sahiptir. Bu, Graphics, raster görüntülerini ve Mathematica 8'in grafiklerini (Graph[]) içerir. Ne yazık ki büyük grafikler, etkileşimli çalışma sırasında gerçekleştirdiğim diğer işlemlerden çok daha uzun süre görselleştirmek için çok uzun zaman alabilir.Grafik [] nesnelerini Mathematica 8

StandardForm ve TraditionalForm öğelerinde Graph[] nesnelerinin otomatik yerleşimini nasıl önleyebilirim ve bunları ör. -Graph-, tercihen çıktının yorumlanabilirliğini korur (belki Interpretation? Kullanarak). Bunun bir şekilde Format ve/veya MakeBoxes değiştirilmesini içereceğini düşünüyorum, ancak bunu işe almakta başarısız oldum.

Bunu tersinir bir şekilde yapmak ve tercihen Graph nesnesine uygulandığında orijinal etkileşimli grafik ekranını döndürecek bir işlev tanımlamak (etkileşimli olmayan GraphPlot ile aynı değil).

İlgili bir notta, belirli sembollerle ilişkilendirilmiş Format/MakeBoxes tanımlarını almanın bir yolu var mı? FormatValues, ilgili bir işlevdir, ancak Graph için boştur.

Numune oturum:

Unprotect[Graph] 

MakeBoxes[g_Graph, StandardForm] /; TrueQ[$short] ^:= 
[email protected][Skeleton["Graph"], g] 

$short = True; 

Daha sonra bir Graph nesne göstermesi gerekir:

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) 
+0

Szabolcs, deneyin benim ' $ PrePrint' sürümü ve çalışıp çalışmadığını söyle. –

cevap

2

Ben Mathematica'yı 8 yok ama bu denemek için, bir olasılık bu yapıyı kullanmaktır Skeleton formunda ve $short = False ayarı varsayılan davranışı geri yüklemelidir.

Umarım bu geçiş otomatik hale getirmek çalışır: Graph değiştirmeyle ilgili

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

Mark'ın kaygısı beni $PrePrint kullanma seçeneği dikkate almak neden oldu. Bunun da yavaş düzen aşamasının gerçekleşmesini önlemesi gerektiğini düşünüyorum. Başka bir şey için $PrePrint'u kullanmadığınız varsayılarak daha fazla istenebilir.

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

$short = True 

Ayrıca elverişli en az Graphics ile sadece Print ile grafiği elde edebilirsiniz (yine ben v7 içinde Graph ile sınamak olamaz). Burada, Grafik ile gösterilen:

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

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

Sonra

enter image description here

ben küresel bir sembol aracılığıyla kolay geçiş için yerinde $short testi bıraktı, ama kimse dışarı ve kullanım bırakabilir

Print[g] 
:

Ve sonra $PrePrint = . varsayılan işlevselliği sıfırlayın.

+0

Çalışıyor gibi görünüyor. interaktifGraphPlot, orijinali verir, ancak etkileşimli özellikleri kullanarak onu <> formuna döndürür. (Aslında bu kısım çok da önemli değildi.) 'Format' ve 'MakeBox'ların nasıl çalıştığını ve aralarındaki farkı (ve ayrıca' ToBoxes ') öğrenmeliyim. Örneğin. neden değiştirilmemiş 'MakeBoxes' bir interaktif nesne, 'ToBoxes', değil,' MakeBoxes 'burada değiştirmek gerekiyor? – Szabolcs

+0

Ne demek istediğini anlayamıyorum, ama 'ToBoxes'' gereklidir; çünkü MakeBoxes’ın çıktısı, beklenen bir şekilde Kutu’dur; Bunu dışarıda bırakmak bir hatayla sonuçlanacaktır. MakeBoxes varsayılan olarak (bu gibi) özel kurallar vermediğiniz sürece ToBox'ları yapıyor. –

+0

@Szabolcs –

1

Sadece çıktıyı bastırmayı denediniz mi? Bunu yaparsanız, V8'in Graph komutunun herhangi bir düzeni olduğunu düşünmüyorum. Bu keşfetmek için, biz kenarlarının büyük listesini oluşturmak ve graph[edges];, Graph[edges]; zamanlamalarını karşılaştırabilir ve GraphPlot[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 

atıl komut, tabii ki, en hızlı olabilir. Graph komutu daha uzun sürüyor, ancak GraphPlot komutu kadar yakın bir yerde değil. Böylece, banagibi Graph, aslında, düzeni hesaplamak değil gibi görünüyor.

Mantıksal soru şu ki, saatte Graph harcanan zaman nedir. Grafiğin köşeler tespit edilmiştir

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]}] 

Not olduğunu ve bu ne yaptığını Graph olduğunu düşünüyorum: en basit durumda Graph çıktı InputForm inceleyelim. Aslında, geçen süre bunu yapmak aklınıza gelebilecek en hızlı şekilde karşılaştırılabilir ilk örnekte Graph[edges], hesaplamak için aldı:

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

Bu 0,087045 saniye sürdü.

+0

'Grafiğin kendisi düzenini yapmıyor, etkileşimli çıktıları var. Grafiklerin oluşturulmasını beklemek gibi. Bu nedenle, bu süreyi "Zamanlama" veya "AbsoluteTiming" kullanarak bile ölçemezsiniz. Evet, çıktıyı bastırabilirim, ama asıl mesele şu ki bunu yapmakla uğraşmak istemiyorum ve arada sırada bunu unutacağım: Çıkmak zorunda kaldığım için baskıyı bastırmayı unuttuğum için cezalandırılmak istemiyorum. Yarım dakika veya daha fazla bekleyiniz. – Szabolcs

+0

Aslında şimdi ben düzeni algoritması ya da tamamlamak için çok uzun zaman alır grafik render olup olmadığını merak etmeye başladım ... – Szabolcs

+0

Ben bu konuda devam bazı ön uç şeyler olmasına rağmen, zaman düzgün bir şekilde ölçmek için benim örnek düzenledim ihmal edilebilir olmalıydı. Zamanlamaların hala benim sonuçlarımı desteklediğini düşünüyorum. Grafik görüntülemenin köşe düzeninden daha pahalı olması konusunda hemfikirim. –

2

GraphGraphLayout seçeneğini ve oluşturma işlemini bastırmak için grafik yapıcılarını kullanabilirsiniz. Bir grafik hala GraphPlot ile görüntülenebilir. daha kolay çalışma yapmak için aşağıdaki

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

enter image description here

deneyin, size ilgilendiğiniz tüm grafik yapıcıları için None için GraphLayout seçeneği ayarlamak için SetOptions kullanabilirsiniz.