這實際上是一個雙重問題。首先:作爲來自OO編程背景的人,我發現Mathematica使用列表作爲一切煩人的基礎。因此,這裏是怎樣一個Mathematica程序員(據我可以告訴)可能定義圖:Mathematica規則和GraphEdit返回的對象之間有什麼區別?
graph={{1, 2, 3, 4, 5}, {1->2, 2->4, 4->4, 4->5}};
,然後,程序員只需要記住,
graph[[1]]
指頂點列表和
graph[[2]]
指邊緣的列表(在這種情況下,定義爲一組的規則。)
所以,我正在學習Mathematica中的規則,並且我看到了讓我的數據結構更具面向對象感的機會。我選擇定義圖是這樣的:
graph={Verts->{1,2,3,4,5}, Edges->{1->2, 2->4, 4->4, 4->5}};
然後
Verts/.graph
Edges/.graph
指頂點和邊(分別)這可能有奇怪的副作用,但是,如果一些其他的數學文件定義然而,Verts或Edges作爲全局變量存在於某個地方,因爲該規則的左手邊不是標識符,而是它本身的一個對象。
所以問題1是這樣的:這是一個很好的做法,或者是創建Mathematica數據結構的一個壞習慣嗎?其中一個我做這種方式是如此,我可以將任意屬性的原因,說顏色:
AppendTo[graph, Colors->{Red, Red, Blue, Red, Red}]; (* Labels ea. vert with a color *)
,我的功能不必知道加入特殊性能的確切順序。例如,你可能有一個功能GETCOLOR等被定義:
GetColor[graph_, vertIdx_]:=(Colors/.graph)[[vertIdx]];
這是可取的,因爲我可能不會總是希望有一個有顏色信息,所以不希望保留在一個點圖數據結構列表(如圖[[[3]]])以獲取顏色信息。
第二:我看到GraphEdit返回的東西看起來像我上面描述的規則。舉例來說,如果我執行(和繪製圖形)
Needs["GraphUtilities`"];
g = GraphEdit[];
g[[2]]
我得到的輸出,如:
Graph->{1->2,3->3,4->4,5->4}
它看起來像一個規則!所以,我試試這個:
Graph/.g[[2]]
期待有
{1->2,3->3,4->4,5->4}
返回。而是輸出只是
Graph
但是,如果我不是執行
g[[2]][[1]] /. g[[2]]
我得到預期的輸出,
{1->2,3->3,4->4,5->4}
這意味着G [[2]]真的是一個規則,但由於某種原因,g [[2]] [[1]](如果執行的話打印Graph)與輸入Graph不同。那麼g [[2]] [[1]]是什麼?
看起來好像它是一個真正的標識符,如果是這樣,我想用上面的問題1解決問題。任何人都知道其中的差異,或者如何在Mathematica中輸入一個和另一個?
我找不到關於這個(或在線)任何文檔的任何內容。謝謝。
哇,這非常有用,並填補了我對Mathematica理解中的很多漏洞。我認爲他們應該爲Mathematica文檔編寫一個類似於Mathematica Programming for C/Java/C++程序員的文檔,其內容類似於C/Java/C++,下面是適當的方式在Mathematica中做...他們可能會想到你寫了它。 – jcb
@quadelirus當談到填補人們對Mathematica的理解時,一個很好的資源是Leonid Shifrin的[Mathematica編程:高級介紹](http://www.mathprogramming-intro.org/)。 – WReach