Wolfram mathematica Mathematica 7支持惰性评估吗?

Wolfram mathematica Mathematica 7支持惰性评估吗?,wolfram-mathematica,lazy-evaluation,Wolfram Mathematica,Lazy Evaluation,假设我在变量G中保存了一个矩阵列表,并应用以下操作: top[g_] = Minors[g] Diagonal[top /@ G] 返回一个矩阵,其中每个元素都是删除了(i,j)行/列的行列式,对角线返回矩阵的对角线元素列表 我的问题是对这些命令的评估-显然,我不希望对所有条目进行评估。Mathematica是懒惰的,因为首先解析对角线,只从子矩阵中提取所需的元素,还是构造子矩阵,然后提取对角线元素 这是一个关于惰性评估的一般性问题,但是对于Mathematica来说,这是一个新问题,我希望

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

top[g_] = Minors[g]
Diagonal[top /@ G] 
返回一个矩阵,其中每个元素都是删除了(i,j)行/列的行列式,
对角线
返回矩阵的对角线元素列表

我的问题是对这些命令的评估-显然,我不希望对所有条目进行评估。Mathematica是懒惰的,因为首先解析对角线,只从子矩阵中提取所需的元素,还是构造子矩阵,然后提取对角线元素


这是一个关于惰性评估的一般性问题,但是对于Mathematica来说,这是一个新问题,我希望您能提供一些关于如何改进特定问题语法的提示。

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

没有Mathematica一般来说并不懒惰

top/@G 
将生成对角运算的矩阵。 因为未成年人不会对矩阵的单个元素进行操作,所以据我所知,您要求的也不是懒惰的评估

不过我想我有一个解决办法

Clear[f];
Diagonal[Minors[G,Length[G],f]]/.f->Det
此解决方案将只产生对角线元素的子元素,并通过对角线求和。 但我只是把过多的计算转移到了过多的内存使用问题上。因为非对角元素的子矩阵仍然是生成的,只是为了被丢弃。
如果我想办法防止出现这种情况,我会再发一次。

你可以自己建立对角线子项列表,然后对矩阵
M
应用
Det
,来解决这个问题:

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

这有点麻烦,但它比使用Mathematica内置的
子项
和只提取对角线元素(在100x100个随机矩阵上测试)快50倍左右。

G是矩阵还是矩阵列表?你的意思是在G上面画一张图吗?然后取矩阵列表的对角线?(+1)作为特定问题的实际解决方案(谢谢!)。我选择了一个不同的答案,因为这个问题是关于Mathematica中的懒惰评估。当你有机会的时候,你能编辑你的问题来提供一个例子(也许是上面提到的那个例子)吗?。Mathematica网站虽然充满了例子,但似乎没有做任何实际的事情。