Mathematica 7是否支持懒惰评估?

时间:2010-02-09 22:52:43

标签: wolfram-mathematica lazy-evaluation

假设我有一个保存在变量G中的矩阵列表并应用以下操作:

top[g_] = Minors[g]
Diagonal[top /@ G] 

Minors返回一个矩阵,其中每个元素都是行列式,删除了(i,j)row / col,Diagonal返回矩阵的对角元素列表。

我的问题是评估这些命令 - 显然我不希望评估所有条目。 Mathematica是否懒惰,首先解析Diagonal,只提取Minors所需的元素,或者是构造的次要矩阵,然后拉出对角元素?

这是懒惰评估的一般问题,但对Mathematica来说是新手我会很感激有关如何改进特定问题语法的任何提示。

3 个答案:

答案 0 :(得分:3)

已经很晚才回答:调查Hold[]及其亲属。有了它们,您可以实现延迟评估功能。大多数内在的Mathematica函数都不是懒惰的,有些是。一般来说,作为一个初学者,你应该避免修改Mathematica内在函数的行为,尽管这样做非常有趣并且很容易使整个系统无法使用。

答案 1 :(得分:3)

您可以通过自己构建对角线未成年人列表,然后对Det矩阵应用M来解决此问题:

Map[Det,Drop[Transpose[Drop[M,{#}]],{#}]& /@ Range[1,Dimensions[M][[1]]]]

这有点像cludge,但它比使用Mathematica的内置Minors并仅挑选对角线元素(在100x100随机矩阵上测试)快约50倍。

答案 2 :(得分:1)

一般来说,mathematica并不懒惰。

top/@G 

将生成一个Diagonal将运行的矩阵。 由于未成年人不对矩阵的各个元素进行操作,因此根据我的知识,您所要求的并不是懒惰的评估。

我想我有一个解决方案。

Clear[f];
Diagonal[Minors[G,Length[G],f]]/.f->Det

此解决方案仅生成对角线元素的Minors,以对角线求和。 但我只是将多余的计算转移到了过多的内存使用问题上。由于非对角元素的子矩阵仍然只是被抛弃而产生。 如果我想到一种防止这种情况的方法,我会再次发帖。