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网站虽然充满了例子,但似乎没有做任何实际的事情。