Domanda

Qualcuno sa se esiste una funzione integrata in Mathematica per ottenere le regole di downvalue (senza alcun valore)? So come scrivere il codice per farlo, ma sembra abbastanza semplice per un built-in

Ad esempio:

a[1]=2;
a[2]=3;

BuiltInIDoNotKnowOf [a] restituisce {1,2}

È stato utile?

Soluzione

Questo sembra funzionare; non sono sicuro di quanto sia utile, tuttavia:

a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]

Altri suggerimenti

È come keys () in Perl e Python e in altre lingue che hanno il supporto integrato per gli hash (ovvero dizionari). Come mostra il tuo esempio, Mathematica supporta gli hash senza alcuna sintassi speciale. Basta dire a [1] = 2 e hai un hash. [1] Per ottenere le chiavi di un hash, ti consiglio di aggiungere questo al tuo init.m o alla tua libreria di utilità personali:

keys[f_] := DownValues[f][[All,1,1,1]]  (* Keys of a hash/dictionary. *)

(O la seguente versione con funzione pura è presumibilmente leggermente più veloce:

keys = DownValues[#][[All,1,1,1]]&;     (* Keys of a hash/dictionary. *)

)

Ad ogni modo, keys [a] ora restituisce ciò che desideri. (Puoi ottenere i valori dell'hash con a / @ keys [a] .) Se vuoi consentire hash arity più alti, come a [1,2] = 5; a [3,4] = 6 quindi puoi usare questo:

SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]

Che restituisce {{1,2}, {3,4}} . (In tal caso puoi ottenere i valori hash con a @@@ keys [a] .)

Nota che DownValues ?? per impostazione predefinita ordina le chiavi, il che probabilmente non è una buona idea poiché nella migliore delle ipotesi richiede più tempo. Se vuoi ordinare le chiavi puoi semplicemente fare Sort @ keys [f] . Quindi consiglierei davvero questa versione:

keys = DownValues[#,Sort->False][[All,1,1,1]]&;

È interessante notare che non vi è alcuna menzione dell'opzione Sort nella documentazione DownValues ??. L'ho scoperto da un vecchio post di Daniel Lichtblau di Wolfram Research. (Ho confermato che funziona ancora nella versione corrente (7.0) di Mathematica.)


Note:

[1] Ciò che è veramente utile è che puoi mescolarlo e abbinarlo con le definizioni delle funzioni. Come:

fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]

È quindi possibile aggiungere la memoizzazione modificando l'ultima riga in

fib[n_] := fib[n] = fib[n-1] + fib[n-2]

che dice di memorizzare nella cache la risposta per tutte le chiamate successive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top