2015-06-10 6 views
7

Questa è una domanda piuttosto facile o forse una domanda troppo facile. Ma ho cercato di trovare il modo di farlo già e non ho potuto trovare nemmeno nel documento GNUplot. Potrebbe essere un mio errore o frainteso qualcosa sul concetto di array in GNUplot. La mia domanda è Come definire e accedere alla matrice in GNUplot?Come definire e accedere alla matrice in GNUplot?

Fornire semplicemente un semplice esempio di dichiarazione di array, assegnare il valore di matrice su loop. penso che sia abbastanza e penso che questo sia utile anche per altre persone.

+1

In realtà, l'ultimo cv della versione di sviluppo 5.1 ora supporta le variabili di array_! – Karl

risposta

8

(Questa risposta sarà obsoleta con la prossima release gnuplot stabile, come l'albero 5.1 di sviluppo ha ora il supporto nativo per le variabili di matrice.)

Il comando "splot" in gnuplot utilizza la parola chiave "allineamento" per definire la dimensione della matrice NxM che contiene i valori delle funzioni per un grafico 3D.

Arrays come quello che un programmatore conosce da C, Pascal, Python, ecc. Non esiste in gnuplot oggi (gp5.0). Potrebbero essere implementati un giorno, perché sarebbero molto utili per tracciare una famiglia di curve con parametri arbitrari (ad esempio adattati).

Se si ha disperatamente bisogno di array in gnuplot, è possibile (ab) utilizzare la funzione word() (e altre funzioni stringa) per ottenere un sostituto un po 'limitato. E 'anche un po' ingombrante:

array = "" 
f(a,x) = a*x 
do for [i=1:5] {array = array.sprintf(" %.3f",i+rand(0)) } 
print "array = ".array 
set xr [0:]; set yr [0:30] 
plot for [i=1:5] f(word(array,i),x) title word(array,i)." x" 

Questo esempio scrive un insieme di numeri casuali per una variabile stringa denominata "allineamento", e poi lo usa per tracciare cinque funzioni lineari che utilizzano i numeri in "serie" per la loro pendenza .

7

Come detto da Karl, non ci sono variabili vettoriali in Gnuplot. Io uso un approccio diverso per eludere questa limitazione. Definisco 2 funzioni che ottengono e impostano valori su una variabile dietro le quinte il cui nome include l'indice. Le funzioni sono:

aGet(name, i) = value(sprintf("_%s_%i", name, i)) 
aSet(name, i, value) = sprintf("_%s_%i = %.16e", name, i, value) 

assegnare e recuperare i valori in array A che fai

eval aSet("A",2,3) 
print aGet("A",2) 

Ciò che queste funzioni fanno è di accedere a una variabile chiamata _A_2.

È possibile costruire funzioni simili a lavorare con le matrici:

mGet(name, i, j) = value(sprintf("_%s_%i_%i", name, i, j)) 
mSet(name, i, j, value) = sprintf("_%s_%i_%i = %.16e", name, i, j, value) 
0

Ispirato risposta @Karl s', sembra ancora più come un array quando mettere la funzione word in un'altra funzione:

array(n) = word("1 2 3 4 5 6 7 8 9", n) 
print array(3) 

Questa stampa 3. Quindi l'indicizzazione è basata su uno.

"Multiply" la array da 2:

print (b="", sum[i=1:9](b=b.(array(i)*2)." ", 0), b) 

Questo stampa 2 4 6 8 10 12 14 16 18. Qui la funzione sum è (ab) utilizzata per eseguire il loop sull'array e il suo risultato viene ignorato.

E qui è più breve, attraverso meno variante generica di @ di bmello risposta:

A_1=1.1; A_2=2.2; A_3=3.3 
A(i) = value("A_".i) 
print A(3) 

Per me ci si sente più intuitiv. Il carattere di sottolineatura _ può essere visto semplicemente come la funzione impostata. Inoltre non è limitato agli indici interi. Sono anche possibili stringhe che danno un comportamento simile a un dizionario.

Problemi correlati