2015-09-26 65 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版本,你应该使用什么就是什么适合您的版本。

请仔细测试以确保没有错误。