arrays - ¿Cómo definir y acceder a la matriz en GNUplot?
(3)
Esta es una pregunta bastante fácil o quizás una pregunta demasiado fácil.
Pero intenté encontrar la forma de hacerlo ya y no pude encontrar ni siquiera en el documento GNUplot.
Podría ser mi error o malentendido algo sobre el concepto de
array
en GNUplot.
Mi pregunta es ¿Cómo definir y acceder a la matriz en GNUplot?
Solo proporcione un ejemplo sencillo de declaración de matriz, asigne el valor de la matriz sobre el bucle. Creo que es suficiente y creo que esto también será útil para otras personas.
(Esta respuesta será obsoleta con la próxima versión estable de gnuplot, ya que el árbol de desarrollo 5.1 ahora tiene soporte nativo para variables de matriz).
El comando "splot" en gnuplot usa la palabra clave "array" para definir el tamaño de la matriz NxM que contiene valores de función para un diagrama 3D.
Las matrices como lo que un programador sabe de C, Pascal, Python, etc., no existen en gnuplot hoy (gp5.0). Podrían implementarse algún día, porque serían muy útiles para trazar una familia de curvas con parámetros arbitrarios (por ejemplo, ajustados).
Si está desesperado por las matrices en gnuplot, puede (ab) usar la función
word()
(y otras funciones de cadena) para lograr un sustituto algo limitado.
También es un poco engorroso:
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"
Este ejemplo escribe un conjunto de números aleatorios en una variable de cadena llamada "matriz", y luego la usa para trazar cinco funciones lineales que usan los números en "matriz" para su pendiente.
Inspirado por la respuesta de @Karl, se ve aún más como una matriz cuando se pone la función de
word
en otra función:
array(n) = word("1 2 3 4 5 6 7 8 9", n)
print array(3)
Esto imprime
3
.
Entonces la indexación está basada en uno.
"Multiplica" la
array
por 2:
print (b="", sum[i=1:9](b=b.(array(i)*2)." ", 0), b)
Esto imprime
2 4 6 8 10 12 14 16 18
.
Aquí la función
sum
se usa (ab) para recorrer la matriz y su resultado se ignora.
Y aquí es más corto, a través de una variante menos genérica de la respuesta de @ bmello:
A_1=1.1; A_2=2.2; A_3=3.3
A(i) = value("A_".i)
print A(3)
Para mí se siente más intuitivo.
El guión bajo
_
puede verse simplemente como la función set.
Además, no se limita a índices enteros.
También son posibles las cadenas que dan un comportamiento similar al de un diccionario.
Si está utilizando Gnuplot 5.1 o superior y necesita una matriz 1-d, simplemente defina la matriz con tamaño N, recordando que los índices van de 1 a N:
gnuplot> array A[3] #Array definition
gnuplot> A[1]=2
gnuplot> A[3]=4
gnuplot> print A[1]
2
gnuplot> print A #Print the array, with empty A[2]
[2,,4]
Si necesita más de una dimensión o está utilizando versiones anteriores de Gnuplot, puede hacer lo siguiente:
Como no hay variables vectoriales en versiones anteriores de Gnuplot, se pueden definir dos funciones para obtener y establecer valores en una variable detrás de escena cuyo nombre incluya el índice. Las funciones son:
aGet(name, i) = value(sprintf("_%s_%i", name, i))
aSet(name, i, value) = sprintf("_%s_%i = %.16e", name, i, value)
Para asignar y recuperar valores en la matriz A, lo hace
eval aSet("A",2,3)
print aGet("A",2)
Lo que hacen estas funciones es acceder a una variable llamada _A_2.
Puede construir una función similar para trabajar con matrices:
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)