Mathematica 7是否支持懒惰评估?

问题描述 投票:8回答:3

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

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

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

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

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

wolfram-mathematica lazy-evaluation
3个回答
3
投票

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


3
投票

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

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

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


1
投票

没有mathematica一般不懒惰。

top/@G 

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

我想我有一个解决方案。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.