2015-09-26 64 views
0

我知道Select[]是某種與列表配合使用的Mathematica函數。但是,我需要能夠通過名稱將每個元素抓取到變量中,以便我可以像在ForEach循環中一樣使用它。如何重寫這個Mathematica循環代碼有效?

下面,您可以看到我將其中一個循環轉換爲Select,但我還有兩個嵌套循環。 Mathematica聲明它具有完整的程序潛力,但它沒有ForEach循環,這使得在某個給定的循環中對每個元素進行操作(做多個函數/動作)要困難得多。

即使這可以轉換成功能列表後打印,我寧願有東西,可以打印,因爲它找到適用的圖形。請注意,我打破了以下區域的功能純度:隨機和打印,如果發現相鄰的頂點使測試的無效,我甚至會打破循環。

我想要做的算法將循環大量的次數(在報告有趣的結果之前它不一定會停止),這個例子當前有5次。產生一個隨機圖形,並找出它是否有一個偏心率大於半徑的頂點,而不是與偏心半徑相鄰的頂點。如果它具有此屬性,則會打印它。

For[x = 0, x < 5, x = x + 1, 
n = RandomInteger[{1, 10}]; 
m = RandomInteger[{n - 1, n * (n - 1)/2}]; 
G = RandomGraph[{n, m}]; 
R = Radius[G]; 
V = VertexList[G]; 
P = Select[V, R + 1 == VertexEccentricity[G, #]]; 
ForEach [p, P, 
    N = AdjacencyList[G, p]; 
    test = true; 
    ForEach[n, N, 
    If[VertexEccentricity[G, n] == R, 
    test = false; 
    ]; 
    ]; 
    If [test == true, 
    Print[G] 
    ] 
    ] 
] 
+0

當您需要循環時,「Do」表單通常更清潔。特別是在這種情況下,因爲你從不使用'x',你只需要'Do [code,{5}]''。作爲另一方的評論,你應該避免用帽子來啓動你自己的符號。 (例如'N'是一個內置的符號) – agentp

+0

另外,雖然Bill表明你在這裏不需要它,但是'Do'構造可以執行你的'ForEach'任務,'Do [code,{p,P} ]'迭代列表'P' – agentp

回答

1

這是功能代碼,我想顯示你的榜樣應該

For[x = 0, x < 5, x = x + 1, 
    n = RandomInteger[{1, 10}]; 
    m = RandomInteger[{n - 1, n*(n - 1)/2}]; 
    G = RandomGraph[{n, m}]; 
    R = GraphRadius[G]; 
    V = VertexList[G]; 
    P = Select[V, R+1 == VertexEccentricity[G, #]&]; 
    vertecc[CapN_] := If[[email protected]@Map[VertexEccentricity[G, #] == R&, CapN], Print[G]]; 
    Map[vertecc[AdjacencyList[G, #]]&, P] 
] 

半徑改爲GraphRadius當Combinatorica包被納入內核周圍8版本,你應該使用什麼就是什麼適合您的版本。

請仔細測試以確保沒有錯誤。