Mathematica Downvalue Lhs
-
02-07-2019 - |
質問
Mathematica に(保持なしで)downvalueルールの左辺を取得するための組み込み関数があるかどうか知っている人はいますか?そのためのコードの書き方は知っていますが、組み込みのコードとしては十分基本的なようです。
例えば:
a[1]=2;
a[2]=3;
BuiltInIDoNotKnowOf[a]
戻り値 {1,2}
解決
これはうまくいくようです。ただし、それがどれほど役立つかはわかりません:
a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]
他のヒント
これは次のようなものです keys()
Perl、Python、およびハッシュ (別名辞書) のサポートが組み込まれているその他の言語で。あなたの例が示すように、Mathematica は特別な構文なしでハッシュをサポートします。言うだけ a[1] = 2
そしてハッシュを持っています。1]ハッシュのキーを取得するには、これをinit.mまたは個人ユーティリティライブラリに追加することをお勧めします。
keys[f_] := DownValues[f][[All,1,1,1]] (* Keys of a hash/dictionary. *)
(または、次の純粋関数バージョンはおそらくわずかに高速です。
keys = DownValues[#][[All,1,1,1]]&; (* Keys of a hash/dictionary. *)
)
どちらにしても、 keys[a]
必要なものを返します。(ハッシュの値は次のように取得できます) a /@ keys[a]
.) より高いアリティのハッシュを許可したい場合は、次のようになります。 a[1,2]=5; a[3,4]=6
次に、これを使用できます:
SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]
どちらが戻りますか {{1,2}, {3,4}}
. 。(その場合、ハッシュ値を取得できます a @@@ keys[a]
.)
ご了承ください DownValues
デフォルトではキーをソートしますが、せいぜい余分な時間がかかるため、おそらく良い考えではありません。キーを並べ替えたい場合は、次のようにするだけです Sort@keys[f]
. 。したがって、実際にはこのバージョンをお勧めします。
keys = DownValues[#,Sort->False][[All,1,1,1]]&;
興味深いことに、それについては言及されていません。 Sort
のオプション DownValues
ドキュメント。私がこのことを知ったのは、Wolfram Research の Daniel Lichtblau の古い投稿からでした。(Mathematica の現バージョン(7.0)でも動作することを確認しました。)
脚注:
[1] 本当に便利なのは、それを関数定義と組み合わせて使用できることです。のように:
fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]
最後の行を次のように変更することで、メモ化を追加できます。
fib[n_] := fib[n] = fib[n-1] + fib[n-2]
これは、後続のすべての呼び出しに対する応答をキャッシュすることを意味します。