假设我有一个保存在变量G
中的矩阵列表并应用以下操作:
top[g_] = Minors[g]
Diagonal[top /@ G]
Minors
返回一个矩阵,其中每个元素都是行列式,删除了(i,j)row / col,Diagonal
返回矩阵的对角元素列表。
我的问题是评估这些命令 - 显然我不希望评估所有条目。 Mathematica是否懒惰,首先解析Diagonal,只提取Minors所需的元素,或者是构造的次要矩阵,然后拉出对角元素?
这是懒惰评估的一般问题,但对Mathematica来说是新手我会很感激有关如何改进特定问题语法的任何提示。
答案 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,以对角线求和。 但我只是将多余的计算转移到了过多的内存使用问题上。由于非对角元素的子矩阵仍然只是被抛弃而产生。 如果我想到一种防止这种情况的方法,我会再次发帖。