8

変数に保存されている行列のリストがありG、次の操作を適用するとします。

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

Minors各要素が(i、j)行/列が削除された行列式である行列をDiagonal返し、行列の対角要素のリストを返します。

私の質問は、これらのコマンドの評価に関するものです。明らかに、すべてのエントリを評価したくはありません。Mathematicaは、最初に対角線が解析され、小行列式から必要な要素のみが抽出されるという意味で怠惰ですか、それとも小行列式が構築されてから、その対角要素が引き出されますか?

これは遅延評価の一般的な質問ですが、Mathematicaを初めて使用する場合は、特定の問題の構文を改善するためのヒントをいただければ幸いです。

4

3 に答える 3

3

遅いので、短い答えだけです:調査Hold[]とその親戚。それらを使用すると、遅延評価関数を実装できます。ほとんどの固有の数学関数は怠惰ではありませんが、いくつかは怠惰です。一般に、初心者としては、Mathematicaの組み込み関数の動作を変更することは避けてください。ただし、変更するのは非常に楽しいことであり、システム全体を非常に簡単に使用できなくする可能性があります。

于 2010-02-09T22:59:07.220 に答える
3

この問題は、対角線の未成年者のリストを自分Detで作成し、行列に適用することで解決できMます。

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

Minorsこれは少し手間がかかりますが、Mathematicaに組み込まれているものを使用して対角要素だけを選択するよりも約50倍高速です(100x100のランダム行列でテスト済み)。

于 2010-02-11T14:22:27.863 に答える
1

一般的に怠惰な数学はありません。

top/@G 

対角線が動作する行列を生成します。未成年者はマトリックスの個々の要素を操作しないので、あなたが求めているのは、私の知る限り、遅延評価でもありません。

私はあなたのための解決策があると思います。

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

このソリューションは、対角要素によって合計される対角要素のマイナーのみを生成します。しかし、私は過剰な計算を過剰なメモリ使用量の問題に移しただけです。対角外の要素の部分行列はまだ生成されているため、破棄されるだけです。それを防ぐ方法も考えたらまた投稿します。

于 2010-02-11T00:39:16.387 に答える