2011-04-09 9 views
12

This La domanda mi ha fatto riflettere su come Mathematica rileva la presenza di più funzioni. Trovo che davvero non capisco il processo.Rilevamento e styling di più funzioni in Mathematica's Plot

considerare:

Plot[{1, Sequence[2, 3], 4}, {x, 0, 1}, PlotRange -> {0, 5}] 

enter image description here

Posso capire che Plot trova tre elementi nella lista inizialmente, ma come fa a "sapere" per lo stile e 23 lo stesso? È come se ci fosse un ricordo di quale parte della lista iniziale provenissero da quei due elementi. Come funziona?

+0

Domanda interessante, poiché 'Plot' ha l'attributo' HoldAll' che deve ancora espandere gli oggetti 'Sequence', il che implica che' Plot' dovrebbe vedere 4 elementi nell'elenco. – rcollyer

+4

@rcollyer Gli oggetti sequenza verranno espansi solo al primo livello in una funzione con l'attributo 'HoldAll'. Confronta 'Hold [{1, Sequence [2, 3], 4}]' con 'Hold [1, Sequence [2, 3], 4]'. Lo stesso vale per "Valutare", ad es. 'Hold [{Evaluate [1 + 1]}]' vs 'Hold [Valuta [1 + 1]]'. – Szabolcs

+0

@Szabolcs, non lo sapevo. Quindi, la risposta è semplicemente che "Sequenza" è espansa dopo che lo stile è stato impostato. Lo aggiungerei alla tua risposta in quanto suggerisce abbastanza chiaramente cosa sta succedendo. – rcollyer

risposta

9

Beh, sa che c'è tre argomenti così:

In[13]:= Function[x, Length[Unevaluated[x]], HoldAll][{1, 
    Sequence[2, 3], 4}] 

Out[13]= 3 

Se x è permesso di valutare, quindi

In[14]:= Function[x, Length[x], HoldAll][{1, Sequence[2, 3], 4}] 

Out[14]= 4 

EDIT: si vede meglio con:

In[15]:= Hold[{1, Sequence[2, 3], 4}] 

Out[15]= Hold[{1, Sequence[2, 3], 4}] 

in altre parole, l'appiattimento della sequenza richiede un valutatore.

EDIT 2: Ho chiaramente perso la vera domanda posta e proverò a rispondere ora.

Una volta che il grafico determina il numero di argomenti che genera {{style1, Line ..}, {style2, Line ..}, ...}. Nel caso di {1, Sequenza [2,3], 4} otteniamo la seguente struttura:

In[23]:= Cases[ 
    Plot[{1, Sequence[2, 3], 4}, {x, 0, 1}, 
    PlotRange -> {0, 5}], {_Hue, __Line}, 
    Infinity] /. {x_Line :> Line, _Hue -> Hue} 

Out[23]= {{Hue, Line}, {Hue, Line, Line}, {Hue, Line}} 

Quando tracciato {1, {2,3}, 4} otteniamo una struttura diversa:

In[24]:= Cases[ 
    Plot[{1, List[2, 3], 4}, {x, 0, 1}, 
    PlotRange -> {0, 5}], {_Hue, __Line}, 
    Infinity] /. {x_Line :> Line, _Hue -> Hue} 

Out[24]= {{Hue, Line}, {Hue, Line}, {Hue, Line}, {Hue, Line}} 

perché le liste sarebbero appiattite, semplicemente non usando il valutatore. Quindi, come si vede il tag nello stesso colore si verifica a causa della sequenza [2,3] viene trattato come una funzione black-box, che restituisce un elenco di due elementi:

In[25]:= g[x_?NumberQ] := {2, 3} 

In[26]:= Cases[ 
    Plot[{1, g[x], 4}, {x, 0, 1}, PlotRange -> {0, 5}], {_Hue, __Line}, 
    Infinity] /. {x_Line :> Line, _Hue -> Hue} 

Out[26]= {{Hue, Line}, {Hue, Line, Line}, {Hue, Line}} 

stavo cercando di costruire un alto livello implementazione che costruirà una tale struttura, ma bisogna combattere il valutatore.Per esempio:

In[28]:= Thread /@ Function[x, 
    Thread[{Hold @@ {Range[Length[Unevaluated[x]]]}, Hold[x]}, Hold] 
    , HoldAll][{1, Sequence[2, 3], 4}] 

Out[28]= Hold[Thread[{{1, 2, 3}, {1, Sequence[2, 3], 4}}]] 

Ora dobbiamo valutare il filo senza valutare i suoi argomenti, che darebbe {{1, 1}, {2, Sequenza [2,3]}, {3, 4}} , dove il primo elemento della lista è un tag e il successivo una volta sono funzioni da campionare.

Spero che questo aiuti.

+0

Sasha, i voti su questa risposta indicano chiaramente che è utile per gli altri, ma il comportamento illustrato è stato evidente per me prima di postare. Quello che ho indovinato è la parte ipotizzata da Szabolcs. Se riesci a spiegare in modo più dettagliato o con maggiore autorità come funziona, lo apprezzerei. –

+0

Grazie per la modifica, è molto più utile! +1 –

+0

@Sasha Come è possibile in * Mathematica * appiattire gli elenchi senza utilizzare il programma di valutazione? –

8

Non è difficile immaginare un processo che porti a questo risultato. Non ho prove aggiuntive del fatto che questo è effettivamente ciò che accade, ma è ragionevole supporre che lo Plot cerchi l'elenco delle funzioni che gli sono state passate e associa uno stile a ciascuna di esse. Quindi procede a valutare ciascuno di essi dopo aver impostato un valore per la variabile trama. Normalmente ogni "funzione" (elemento nell'elenco passato a Plot) restituirebbe un numero reale. Tuttavia, dalla versione 6, Mathematica è in grado di gestire anche quelli che restituiscono elenchi di numeri, con il difetto che utilizza lo stesso stile per l'elenco completo. La versione 5 genererebbe un errore per le funzioni che restituivano gli elenchi.