我知道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]
]
]
]
当您需要循环时,“Do”表单通常更清洁。特别是在这种情况下,因为你从不使用'x',你只需要'Do [code,{5}]''。作为另一方的评论,你应该避免用帽子来启动你自己的符号。 (例如'N'是一个内置的符号) – agentp
另外,虽然Bill表明你在这里不需要它,但是'Do'构造可以执行你的'ForEach'任务,'Do [code,{p,P} ]'迭代列表'P' – agentp