【问题标题】:Does Mathematica 7 support lazy evaluation?Mathematica 7 是否支持惰性求值?
【发布时间】:2011-01-15 01:03:06
【问题描述】:

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

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

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

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

这是关于惰性求值的一般问题,但是对于 Mathematica 新手来说,如果我能提供任何关于如何改进特定问题的语法的提示,我将不胜感激。

【问题讨论】:

  • G 是矩阵还是矩阵列表?你的意思是在G上映射?然后取矩阵列表的对角线?

标签: wolfram-mathematica lazy-evaluation


【解决方案1】:

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

【讨论】:

  • 当您有机会时,您能否编辑您的问题以提供一个示例(也许是所述的特定示例)? Mathematica 网站虽然充满了例子,但似乎并没有做任何实际的事情。
【解决方案2】:

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

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

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

【讨论】:

  • (+1) 对于特定问题的实际解决方案(谢谢!)。我选择了不同的答案,因为问题是关于 Mathematica 中的惰性求值。
【解决方案3】:

一般来说没有mathematica是不懒惰的。

top/@G 

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

不过,我想我有一个解决方案。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    相关资源
    最近更新 更多