8

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

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

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

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

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

4

3 回答 3

3

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

于 2010-02-09T22:59:07.220 回答
3

您可以通过自己建立对角小数列表然后应用Det,来解决这个问题M

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

这有点杂乱无章,但它比使用 Mathematica 的内置功能Minors并仅提取对角线元素(在 100x100 随机矩阵上测试)快约 50 倍。

于 2010-02-11T14:22:27.863 回答
1

没有mathematica 一般不懒惰。

top/@G 

将生成对角线将对其进行操作的矩阵。由于 Minors 不对矩阵的单个元素进行操作,因此据我所知,您所要求的也不是惰性求值。

我想我有一个解决方案给你。

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

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

于 2010-02-11T00:39:16.387 回答