假设我有一个保存在变量G
中的矩阵列表并应用以下操作:
top[g_] = Minors[g]
Diagonal[top /@ G]
Minors
returns一个矩阵,其中每个元素是删除了(i,j)row / col的行列式,Diagonal
返回矩阵的对角元素列表。
我的问题是关于这些命令的评估 - 显然我不希望评估所有条目。 Mathematica是否懒惰,首先解析Diagonal,只提取Minors所需的元素,或构造的次要矩阵,然后拉出对角线元素?
这是懒惰评估的一般问题,但对Mathematica来说是新手我会很感激有关如何改进特定问题语法的任何提示。
已经晚了,所以只有一个简短的答案:调查Hold[]
及其亲属。有了它们,您可以实现延迟评估功能。大多数内在的Mathematica函数都不是懒惰的,有些是。一般来说,作为一个初学者,你应该避免修改Mathematica内在函数的行为,尽管这样做非常有趣,并且很容易使整个系统无法使用。
您可以通过自己构建对角线未成年人列表然后应用Det
来解决这个问题,对于矩阵M
:
Map[Det,Drop[Transpose[Drop[M,{#}]],{#}]& /@ Range[1,Dimensions[M][[1]]]]
这有点像cludge,但它比使用Mathematica内置Minors
并仅仅挑选对角线元素(在100x100随机矩阵上测试)快约50倍。
没有mathematica一般不懒惰。
top/@G
将生成一个Diagonal将运行的矩阵。由于未成年人不对矩阵的各个元素进行操作,因此根据我的知识,您所要求的并不是懒惰的评估。
我想我有一个解决方案。
Clear[f];
Diagonal[Minors[G,Length[G],f]]/.f->Det
此解决方案仅生成对角线元素的Minors,以对角线求和。但我只是将多余的计算转移到了过多的内存使用问题上。由于非对角元素的子矩阵仍然只是被抛弃而产生。如果我想到一种防止这种情况的方法,我会再次发帖。