代码之家  ›  专栏  ›  技术社区  ›  Hooked

Mathematica 7是否支持延迟评估?

  •  8
  • Hooked  · 技术社区  · 16 年前

    假设我在变量中保存了一个矩阵列表 G 并执行以下操作:

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

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

    我的问题是对这些命令的评估——显然我不希望对所有条目进行评估。Mathematica是否懒惰地认为,首先解析对角线,只从次矩阵中提取所需的元素,或者构造次矩阵,然后拉出其对角线元素?

    这是一个懒惰评估的一般问题,但是对于Mathematica来说,这是一个新问题,对于如何改进特定问题的语法,我将非常感谢。

    3 回复  |  直到 7 年前
        1
  •  3
  •   user229044    13 年前

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

        2
  •  3
  •   Timo    16 年前

    你可以通过自己建立对角线的未成年人列表然后应用来解决这个问题。 Det ,对于矩阵 M :

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

    这有点笨拙,但比使用Mathematica内置的方法快50倍。 Minors 只选取对角线元素(在100x100随机矩阵上测试)。

        3
  •  1
  •   Davorak    16 年前

    一般来说,没有数学家不懒惰。

    top/@G 
    

    将生成一个对角运算的矩阵。 由于未成年人不在矩阵的各个元素上操作,根据我的知识,你所要求的也不是懒惰的评估。

    不过,我想我有一个解决办法。

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

    这个解只会产生要用对角线求和的对角线元素的次方。 但我只将多余的计算转移到了多余的内存使用问题上。因为非对角元素的子矩阵仍然只会被丢弃。 如果我想办法防止这种情况的发生,我会再发一次。