表达式

一般来说,任何能被 C, FORTRAN, Pascal 或者 BASIC 接受的数学表达式都是有效的。这些运算符的优先级遵循 C 语言规范。表达式内的空格(空格和制表符)被忽略。

注意,gnuplot 同时使用“实数”和“整数”算数,就像 FORTRAN 和 C。整数输入为 "1", "-10" 等,实数为 "1.0", "-10.0", "1e1", 3.5e-1,以及等等。两种形式最重要的区别在于除法:

  • 整数除法:被截断, 5/2 = 2
  • 实数除法:不截断, 5.0/2.0 = 2.5

在混合表达式中,整数在计算之前被“提升”为实数:5/2.0 = 2.5。负整数和正整数之间的除法,不同的编译器可能会得到各种不同的结果。尝试用print -5/2这样的测试来检查你的系统是向下舍入 (-5/2结果得 -3) 还是向零舍入 (-5/2结果得 -2)。

整数表达式 "1/0" 用于产生一个 "undefined" (未定义)标记,这可以让一个点被忽略。也可用预定义的变量 NaN 获得相同的结果。示例参见using

Gnuplot 也可以对字符串和字符串变量执行简单的操作。例如,表达式 ("A" . "B" eq "AB") 计算结果为 true,演示了字符串连接运算符和字符串相等运算符。

如果在数字表达式中,使用含有数字值得字符串,则该字符串会被“提升”为相应的整数或者实数。因此 ("3" + "4" == 7) 和 (6.78 == "6.78") 计算结果都为 true。如果在字符串连接中使用整数(不能是实数或者复数),该整数会被“提升”为字符串。一个典型的例子是用整数来构造文件名或者其他字符串,例如 ("file" . 4 eq "file4") 结果为 true。

子字符串可以用后缀范围描述符[beg:end]来指定。例如,"ABCDEF"[3:4] == "CD""ABCDEF"[4:*] == "DEF",语法"string"[beg:end]完全等效于调用内建字符串赋值函数substr("string",beg,end),除了你不能省略函数调用的 beg 或者 end。

常数

整型常量通过 C 库的例程strtoll()来解析。这意味着以 "0" 开头的常量被解析为八进制,以 "0x" 或者 "0X" 开头的常量被解析为十六进制。

浮点型常量通过 C 库的例程atof()来解析。

复数常数表示为{<real>,<imag>},其中<real><imag>必须是数字常量。例如,{3,2}代表3 + 2i{0,1}代表i本身。此处的大括号不可或缺。

字符串常量由用单引号或双引号括住的字符序列组成。单引号和双引号的区别很重要。参见引号

示例

1 -10 0xffaabb        # 整型常量
1.0 -10\. 1e1 3.5e-1  # 浮点型常量
{1.2, -3.4}           # 复数常量
"Line 1\nLine 2"      # 字符串常量 (\n 是换行符)
'123\n456'            # 字符串常量 (\ 和 n 是普通字符)

注意到上面的单引号和双引号之间的区别了吗?

函数

gnuplot中数学函数的参数可以是整数、实数或者复数,除非另有说明。接受或者返回角度的函数(例如sin(x))将角度值视为弧度,但可用命令set angles改为度。

数学库函数

函数 参数 返回
abs(x) 任意 ∣x∣,x的绝对值,同类型
abs(x) 复数 x的长度,√Re(x)2+Im(x)2
acos(x) 任意 cos−1x(反余弦)
acosh(x) 任意 cosh−1x(反双曲余弦),单位为弧度
airy(x) 任意 艾里函数Ai(x)
arg(x) 复数 x的相位
asin(x) 任意 sin−1x(反正弦)
asinh(x) 任意 sinh−1x(反双曲正弦),单位为弧度
atan(x) 任意 tan−1x(反正切)
atan2(y,x) 整数或实数 tan−1(yx)(反正切)
atanh(x) 任意 tanh−1x(反双曲正切),单位为弧度
EllipticK(k) 实数k,范围 (-1:1) K(k)第一类完全椭圆积分
EllipticE(k) 实数k,范围 [-1:1] E(k)第二类完全椭圆积分
EllipticPi(n,k) 实数n<1,实数k范围 (-1:1) Π(n,k)第三类完全椭圆积分
besj0(x) 整数或实数 x的J0贝塞尔函数,单位弧度
besj1(x) 整数或实数 x的J1贝塞尔函数,单位弧度
besy0(x) 整数或实数 x的Y0贝塞尔函数,单位弧度
besy1(x) 整数或实数 x的Y1贝塞尔函数,单位弧度
ceil(x) 任意 ⌈x⌉,不小于x的最小整数 (实部)
cos(x) 弧度 x的余弦
cosh(x) 任意 x的双曲余弦,单位弧度
erf(x) 任意 erf(Re(x)),real(x)的误差函数
erfc(x) 任意 erfc(Re(x)),real(x)的1.0 - 误差函数
exp(x) 任意 ex,x的指数函数
expint(n,x) 任意 En(x),x的指数积分函数
floor(x) 任意 ⌊x⌋, 不大于x的最大整数 (实部)
gamma(x) 任意 Γ(Re(x)),real(x)的伽马函数
ibeta(p,q,x) 任意 ibeta(Re(p,q,x)),real(p,q,x)的 ibeta 函数
inverf(x) 任意 real(x)的逆误差函数
igamma(a,x) 任意 igamma(Re(a,x)),real(a,x)的 igamma 函数
imag(x) 复数 Im(x),x的虚部,实数
invnorm(x) 任意 real(x)逆正态分布函数
int(x) 实数 x的整数部分,向零截断
lambertw(x) 实数 兰伯特W函数
lgamma(x) 任意 lgamma(Re(x)),real(x)的 lgamma 函数
log(x) 任意 lnx,x的自然对数 (以e为底)
log10(x) 任意 log10x,x的对数 (以 10 为底)
norm(x) 任意 norm(x),real(x)的正态分布函数
rand(x) 整数 [0:1] 范围内的伪随机数
real(x) 任意 Re(x),x的实部
sgn(x) 任意 1 如果x>0, -1 如果x<0, 0 如果x=0。I(x)被忽略
sin(x) 任意 x的正弦
sinh(x) 任意 x的双曲正弦,单位弧度
sqrt(x) 任意 √x,x的平方根
tan(x) 任意 x的正切
tanh(x) 任意 x的双曲正切,单位弧度
voigt(x,y) 实数 高斯和洛伦兹卷积

源自 libcerf 的特殊函数 (如果可用)

函数 参数 返回
cerf(z) 复数 复误差函数
cdawson(z) 复数 复道森积分
faddeeva(z) 复数 重新调整的复误差函数w(z)=exp(−z²)×erfc(−iz)
erfi(x) 实数 虚误差函数erfi(x)=−i×erf(ix)
VP(x,sigma,gamma) 实数 佛克特剖线

字符串函数

函数 参数 返回
gprintf("format",x,...) 任意 从应用的 gnuplot 格式解析器获得结果字符串
sprintf("format",x,...) 多种类型 从 C 语言的 sprintf 获得结果字符串
strlen("string") 字符串 按字节的字符串的整型长度
strstrt("string","key") 字符串 子字符串 "key" 第一个字符的整型索引
substr("string",beg,end) 多种类型 字符串 "string"[beg:end]
strftime("timeformat",t) 任意 从应用的 gnuplot 时间解析器获得结果字符串
strptime("timeformat",s) 字符串 以字符串 s 给出的自 1970 年来的秒数
system("command") 字符串 包含 shell 命令的输出流的字符串
word("string",n) 字符串,整型 返回 "string" 中的第 n 个单词
words("string") 字符串 返回 "string" 的单词数

其他 gnuplot 函数

函数 参数 返回
column(x) 整型或字符串 数据输入期间第x列的内容
columnhead(x) 整型 数据文件内包含列x中第一个条目的字符串
exists("X") 字符串 如果已定义名为 X 的变量则返回 1,否则返回 0
hsv2rgb(h,s,v) h,s,v 范围 [0:1] 将 HSV 颜色转换为 24 位 RGB 颜色
stringcolumn(x) 整型 作为字符串的第x列内容
timecolumn(N,format) 整型,字符串 数据输入期间第N列的时间数据
tm_hour(x) 整型 小时
tm_mday(x) 整型 月的第几天
tm_min(x) 整型 分钟
tm_mon(x) 整型 月份
tm_sec(x) 整型 秒钟
tm_wday(x) 整型 周的第几天
tm_yday(x) 整型 年的第几天
tm_year(x) 整型 年份
time(x) 任意 当前系统时间
valid(x) 整型 数据文件操作期间测试x列的有效性
value("name") 字符串 返回命名变量的当前值

abs

abs(x)函数返回变量的绝对值。返回的值与变量的值类型相同。

对于复数变量,abs(x)定义为 x 在复平面上的长度 [即sqrt(real(x)**2 + imag(x)**2)]。这也被称为 x 的范数或复数模。

acos

acos(x)函数返回其参数的反余弦。acos按照set angles选择的弧度或度来返回参数。

acosh

acosh(x)返回以弧度为单位的参数的反双曲余弦。

airy

airy(x)函数其参数的艾里函数Ai(x)的值。函数Ai(x)是方程y'' - x y = 0的解,它是处处有限的。如果参数是复数,则其虚部被忽略。

arg

arg(x)函数返回复数的相位,由set angles选择用弧度还是度为单位。

asin

asin(x)函数其参数的反正弦。asin按照set angles选择的弧度或度来返回参数。

asinh

asinh(x)函数返回弧度单位的参数的反双曲正弦。

atan

atan(x)返回其参数的反正切。atan按照set angles选择的弧度或度来返回参数。

atan2

atan2(y,x)函数返回其参数实部比值的反正切。atan2在正确的象限中返回由set angles选择的弧度或度的参数。

atanh

atanh(x)返回弧度单位的参数的反双曲正切。

EllipticK

EllipticK(k)函数返回第一类完全椭圆积分。详情参见椭圆积分

EllipticE

EllipticE(k)函数返回第二类完全椭圆积分。详情参见椭圆积分

EllipticPi

EllipticPi(n,k)函数返回第三类完全椭圆积分。详情参见椭圆积分

besj0

besj0(x)函数返回其参数的第 J0 个贝塞尔函数。besj0期望其参数以弧度表示。

besj1

besj1(x)函数返回其参数的第 J1 个贝塞尔函数。besj1期望其参数以弧度表示。

besy0

besy0(x)函数返回其参数的第 Y0 个贝塞尔函数。besy0期望其参数以弧度表示。

besy1

besy1(x)函数返回其参数的第 Y1 个贝塞尔函数。besy1期望其参数以弧度表示。

ceil

ceil(x)函数返回不小于其参数的最小整数。对于复数,ceil返回不小于其参数实部的最小整数。

cos

cos(x)函数返回其参数的余弦。cos接受弧度或度为单位的参数,由set angles设置。

cosh

cosh(x)函数返回其参数的双曲余弦。cosh期望其参数以弧度表示。

erf

erf(x)函数返回其参数实部的误差函数。如果参数是一个复数,则其虚部被忽略。参见erfc,inverfnorm

erfc

erfc(x)函数返回1.0 - 其参数实部的误差函数。如果参数是一个复数,则其虚部被忽略。参见erf,inverfnorm

exp

exp(x)函数返回其参数的指数函数 (e的 x 次方)。在有些实现中 (特别 sun 的系统),exp(-x)对于非常大的 x 返回“未定义”。这些情况下,用户定义的函数如safe(x) = x<-100 ? 0 : exp(x)被证明是有用的。

expint

expint(n,x)函数返回其参数实部的指数积分:从 1 到无限大的t^(-n) e^(-tx) dt的积分。n 必须是一个非负整数,x>=0,且x>0n>1

floor

floor(x)函数返回不大于其参数的最大整数。对于复数,floor返回不大于其参数实部的最大整数。

gamma

gamma(x)函数返回其参数实部的伽马函数。对于整数 n,gamma(n+1) = n!。如果其参数是一个复数,则其虚部被忽略。

ibeta

ibeta(p,q,x)函数返回其参数实部的不完整 β 函数。p, q > 0且 x 在 [0:1] 中。如果参数是复数,则其虚部被忽略。这个函数是通过连分方法逼近的 (Abramowitz and Stegun, 1964)。逼近只有在x < (p-1)/(p+q-2)区间才是准确的。

inverf

inverf(x)函数返回其参数实部的逆误差函数。参考erfinvnorm

igamma

igamma(a,x)函数返回其参数实部的归一化不完全伽马函数,其中a > 0x >= 0。标准写法是P(a,x),例如 Abramowitz and Stegun (6.5.1),当 x 接近无限时,极限值为 1。如果参数是复数,则其虚部被忽略。

imag

imag(x)函数将其参数的虚部作为实数返回。

invnorm

invnorm(x)函数返回参数实部的逆累积正态 (高斯) 分布函数。参见norm

int

int(x)函数返回其参数的整数部分,向零截断。

lambertw

lambertw(x)函数返回兰伯特 W 函数的主分支的值,其定义公式为(W(x)*exp(W(x))=x, x 必须是实数,且x >= -exp(-1)

lgamma

lgamma(x)函数返回其参数实部的伽马函数的自然对数,如果参数是一个复数,则其虚部被忽略。

log

log(x)函数返回其参数的自然对数 (以e为底)。参见log10

log10

log10(x)函数返回其参数的对数 (底为 10)。

norm

norm(x)函数返回其参数实部的累积正态(高斯)分布函数。参见invnorm,erferfc

rand

rand(x)函数返回[0:1]区间的伪随机数。详情参见random

real

real(x)函数返回其参数的实部。

sgn

sgn(x)函数在其参数为正时返回 1,为负时返回 -1,为 0 时返回 0。如果参数是一个复数值,则其虚部被忽略。

sin

sin(x)函数返回其参数的正弦。sin期望其参数用弧度或度做单位,由set angles设置。

sinh

sinh(x)函数返回其参数的双曲正弦。sinh期望其参数用弧度表示。

sqrt

sqrt(x)函数返回其参数的平方根。如果 x 是一个复数值,总是返回正的实部的根。

tan

tan(x)函数返回其参数的正切。tan的参数可以用弧度或度做单位,由set angles选择。

tanh

tanh(x)函数返回其参数的双曲正切。tanh期望其参数用弧度表示。

voigt

voigt(x,y)函数返回频谱分析中使用的 Voigt/Faddeeva 函数的逼近值。逼近精度达 10^4 分之一。如果 libcerf 例程可用,则使用re_w_of_z()例程来提供更精确的值。注意,voigt(x,y) = real(faddeeva( x + y*{0,1} ))

cerf

cerf(z)是复数版的误差函数 erf(x)

cdawson

cdawson(z)返回复数 z 的道森积分结果。cdawson(z) = sqrt(pi)/2 * exp(-z^2) * erfi(z)

faddeeva

faddeeva(z)函数返回重新调整的复数误差函数faddeeva(z) = exp(-z^2) * erfc(-i*z)。这对应于 Abramowitz 和 Stegun 的公式 7.1.3 和 7.1.4。

erfi

虚误差函数erfi(x) = -i * erf(ix)

Voigt Profile

VP(x,sigma,gamma)对应于由高斯 G(x;sigma) 与洛伦兹 L(x;gamma) 卷积而定义的佛克特剖线。

gprintf

gprintf("format",x)将 gnuplot 自己的格式说明符应用于单个变量 x 并返回结果字符串。如果要用标准的 C 语言格式说明符,必须使用sprintf("format",x)。参见格式说明符

sprintf

sprintf("format",var1,var2,...)将标准的 C 语言格式说明符应用于多个参数并返回结果字符串。如果需要 gnuplot 自己的格式说明符,必须用gprintf()。有关 sprintf 格式说明符的信息,请参考标准的 C 语言文档或者 unix 的 sprintf 手册页。

strlen

strlen("string")返回以字节为单位的字符串长度。如果当前的编码支持多字节字符,则结果可能大于实际的字符数。

strstrt

strstrt("string","key")在 "string" 中搜索字符串 "key",返回到 "key" 第一个字符的索引。如果找不到 "key",返回 0。类似于 C 库函数 strstr,除了它返回一个索引而不是字符串指针。strstrt("hayneedlestack","needle") = 4

substr

substr("string",beg,end)返回原始字符串从 beg 到 end 的子字符串。完全等效于表达式 "string"[beg:end],只是不能忽略选项 beg 或 end。

strftime

strftime("timeformat",t)将时间格式说明符应用到以秒为单位给出的自 1970 年以来的时间 t 中。参见时间说明符strptime

strptime

strptime("timeformat",s)使用时间格式说明符从字符串 s 读取时间,将其转换为自 1970 年以来的秒数。参见时间说明符strftime

system

system("command")使用标准 shell 执行 "command",将结果字符流作为字符串变量从 stdout 中返回。可选的尾随换行符被忽略。

可以用'f(x) = real(system(sprintf("somecommand %f", x)))'的形式将外部函数导入到 gnuplot 脚本中。

word

word("string",n)返回字符串中的第 n 个单词。例如word("one two three",2)返回字符串 "two"。

words

words("string")返回字符串中的单词数。例如words(" a b c d")返回 4。

column

column(x)只能作为 plot、 splot 或 stats 命令的一部分。用来获取 x 列的内容(数值)。参见plot datafile using

columnhead

columnhead(x)只能作为 plot、 splot 或 stats 命令的一部分。用来获取 x 列第一行的内容(字符串)。参见plot datafile using

exists

exists()的参数是一个字符串常量或者字符串变量,如果该字符串是一个已经定义的变量的名称,函数返回 1,否则返回 0。

hsv2rgb

hsv2rgb(h,s,v)函数将 HSV (色相/饱和度/值) 三元值转换为等效的 RGB 值。

stringcolumn

stringcolumn(x)只能在拟合或数据文件绘图时,在表达式中作为using操作的一部分。它将 x 列的内容作为字符串变量返回。strcol(x)stringcolumn(x)的缩写方式。参见plot datafile using

timecolumn

timecolumn(N,"timeformat")只能在拟合或数据文件绘图时,在表达式中作为using操作的一部分。参见plot datafile using

它读取从 N 列开始的字符串数据作为时间/日期值,并用 "timeformat" 将其解释为“自纪元以来的秒数”,精度达毫秒级。注意:在 5 版以前,此函数仅用一个参数,而且只适用于纯粹包含坐标轴坐标的列。

tm_hour

tm_hour(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回小时 (0--23 的整数)。

tm_mday

tm_mday(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回天 (1--31 的整数)。

tm_min

tm_min(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回分 (0--59 的整数)。

tm_mon

tm_mon(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回月 (0--11 的整数)。

tm_sec

tm_sec(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回秒 (0--59 的整数)。

tm_wday

tm_wday(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回一周中第几天 (0--6 的整数)。

tm_yday

tm_yday(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回一年中的第几天 (1--366 的整数)。

tm_year

tm_year(x)函数将参数解释为时间,是自 1970 年 1 月 1 日以来的秒数。作为实数返回年 (整数)。

time

time(x)返回当前的系统时间。该值可用strftime函数转换为日期,也可结合timecolumn来生成相对的时间/日期图形。参数的类型决定了返回的内容。如果参数是一个整数,time()将当前时间作为整数返回,是自 1970 年 1 月 1 日以来的秒数。如果参数是实数(或者复数),结果同样是实数。如果参数是一个字符串,则假定它是一个格式字符串,并将其传递给strftime以提供格式化的时间字符串。

valid

valid(x)只能在拟合或数据文件绘图时,在表达式中作为using操作的一部分。参见plot datafile using

椭圆积分

EllipticK(k)函数返回第一类的完全椭圆积分。即函数(1−(k∗sin(p))2)−0.5在 0 到 pi/2 之间的定积分。k的域 -1 到 1 (不含)。

EllipticE(k)函数返回第二类的完全椭圆积分。即函数 **(1-(k*sin(p))**2)0.5在 0 到 pi/2 之间的定积分。k的域 -1 到 1 (含)。

EllipticPi(n,k)函数返回第三类完全椭圆积分。即函数 **(1-(k_sin(p))2)(-0.5)/(1-n_sin(p)2)在 0 到 pi/2 之间的定积分。参数n必须小于 1,而k必须介于 -1 和 1 之间 (不含)。注意,根据定义EllipticPi(0,k) == EllipticK(k)k的所有可能的值。

随机数生成器

函数rand()生成在 0 到 1 之间的伪随机数,算法来自 P. L'Ecuyer and S. Cote, "Implementing a random number package with splitting facilities", ACM Transactions on Mathematical Software, 17:98-111 (1991)。

  rand(0)     返回区间 [0:1] 中的伪随机数
              从两个内部 32 位种子的当前值产生
  rand(-1)    将两个种子重置为标准值
  rand(x)     对于 0 < x < 2^31-1 的整数,将两个内部种子设置为 x
  rand({x,y}) 对于 0 < x,y < 2^31-1 的整数,设置 seed1=x, seed2=y

value

B = value("A")实际上与B = A,其中 A 是用户定义变量的名称。当变量的名字本身被保存在一个字符串变量中时,这很有用。参见用户定义的变量。它还允许你从数据文件中读取变量的名称。如果参数是一个数字表达式,value()返回该表达式的值。如过参数是一个字符串,但不是任何已定义变量的名称,则value()返回 NaN。

单词计数和提取

word("string",n)返回字符串中的第 n 个单词,例如word("one two three",2)返回字符串 "two"。

words("string")返回字符串中的单词个数。例如words(" a b c d")返回 4。

wordwords函数对引号括住的字符串提供有限的支持,单引号和双引号都可使用:

  print words("\"double quotes\" or 'single quotes'")   # 3

起始的引号前面可以是一个空格,否则引号作为字符串的开头。这意味着,单词中间或者末尾的撇号将被认为是相应单词的一部分:

  print words("Alexis' phone doesn't work") # 4

不支持转义引号字符。如果你想保留某个引号,则相应部分必须用其他类型的引号括住:

  s = "Keep \"'single quotes'\" or '\"double quotes\"'"
  print word(s, 2) # 'single quotes'
  print word(s, 4) # "double quotes"

注意,最后的这个例子中,转义引号仅用于字符串定义。

运算符

除非另有说明,否则gnuplot中的运算符与 C 语言中对应的运算符相同,只是所有运算符都接受整数、实数和复数参数。支持 FORTRAN 一样的**运算符(指数运算)。

括号可用于改变运算顺序。

一元运算符

以下是所有一元运算符及其用法的列表:

符号 示例 说明
- -a 一元减
+ +a 一元加 (无操作)
~ ~a * 补码、反码
! !a * 逻辑非
! a! * 阶乘
$ $3 * 在using操作期间调用变量/列
` ` ` A ` 数组 A 的基数

(*) 加星号表示该运算符需要一个整数参数。

运算符优先级与 Fortran 和 C 相同。在这些语言中,可以用括号来改变运算顺序。因此-2**2 = -4,但是(-2)**2 = 4

阶乘运算符返回实数以允许更大的范围。

二元运算符

以下是所有二元运算符及其用法的列表:

符号 示例 说明
** a**b 指数运算、求冥、乘方
* a*b 乘法
/ a/b 除法
% a%b * 求模
+ a+b 加法
- a-b 减法
== a==b 相等
!= a!=b 不等
< a<b 小于
<= a<=b 小于或等于
> a>b 大于
>= a>=b 大于或等于
<< 0xff<<1 无符号左移位
>> 0xff>>1 无符号右移位
& a&b * 按位与
^ a^b * 按位异或
` ` `a b` * 按位或
&& a&&b * 逻辑与
` ` `a b` * 逻辑或
= a = b 赋值
, (a,b) 序列求值
. a.b 字符串连接
eq A eq B 字符串相等
ne A ne B 字符串不等

(*) 加星号表示该运算符需要整数参数。大写字母 A 和 B 表示该运算符需要字符串参数。

逻辑与 (&&) 和或 (||) 使用短路规则。也就是说,如果第一个&&为 false,则不继续评估第二个;如果第一个||为 true,则不继续评估第二个。

序列求值仅在括号内进行,并按照从左到右顺序进行。返回最右边的子表达式的值。

三元运算符

只有一个三元运算符:

符号 示例 说明
?: a?b:c * 三元操作

三元运算符的行为与 C 相同。第一个参数 (a) 必须为整数,求值后,如果为 true (非零),则计算第二个参数 (b) 并返回结果,否则返回第三个参数 (c) 的求值结果。

三元运算符在构造函数片段和绘制某些符合条件的点时非常有用。

示例

0 <= x < 1区间绘制函数sin(x),在1 <= x < 2区间绘制1/x,其余区间不绘制(未定义):

    f(x) = 0<=x && x<1 ? sin(x) : 1<=x && x<2 ? 1/x : 1/0
    plot f(x)

请注意,gnuplot静静地忽略未定义的值,所以函数的最后一个分支 (1/0) 将不会生成可绘制的点。还要注意,如果使用了线条样式,则 f(x) 即使在不连续区间也是作为一个连续函数绘制的。要绘制为不连续曲线,为这两个部分分别创建单独的函数 (也可用参数函数实现此目的)。

对于文件中的数据,当第 4 列为非负时,以第 1 列为因变量绘制第 2 和第 3 列的平均值:

plot 'file' using 1:( $4<0 ? 1/0 : ($2+$3)/2 )

要了解using语法,参考plot datafile using

求和

求和表达式形式如下

  sum [<var> = <start> : <end>] <expression>

<var>视为整数变量,该变量从<start><end>取得连续整数值。对于取得的每个整数值,将<expression>的当前值加入到合计当中,其最终值就是求和表达式的值。例子:

      print sum [i=1:10] i
          55.
      # 等效于 plot 'data' using 1:($2+$3+$4+$5+$6+...)
      plot 'data' using 1 : (sum [col=2:MAXCOL] column(col))

<expression>没有强制要求有变量<var>。尽管<start><end>可以指定为变量或表达式,但他们的值不能作为进行求和的副作用来动态改变。如果<end>小于<start>,那么求和的值为 0。

Gnuplot 定义的变量

Gnuplot 维护了一些只读变量,它们反映了程序的当前状态和最近的图形。这些变量以前缀 "GPVAL_" 开头。例如 GPVAL_TERM, GPVAL_X_MIN, GPVAL_X_MAX, GPVAL_Y_MIN。键入show variables all显示完整的列表和当前值。与坐标轴参数(范围、对数底数)有关的值是最后一个绘图中使用的值,而不是当前set

示例:计算点 [X,Y] 的分数屏幕坐标

     GRAPH_X = (X - GPVAL_X_MIN) / (GPVAL_X_MAX - GPVAL_X_MIN)
     GRAPH_Y = (Y - GPVAL_Y_MIN) / (GPVAL_Y_MAX - GPVAL_Y_MIN)
     SCREEN_X = GPVAL_TERM_XMIN + GRAPH_X * (GPVAL_TERM_XMAX - GPVAL_TERM_XMIN) 
     SCREEN_Y = GPVAL_TERM_YMIN + GRAPH_Y * (GPVAL_TERM_YMAX - GPVAL_TERM_YMIN)
     FRAC_X = SCREEN_X * GPVAL_TERM_SCALE / GPVAL_TERM_XSIZE
     FRAC_Y = SCREEN_Y * GPVAL_TERM_SCALE / GPVAL_TERM_YSIZE

如果任何 gnuplot 命令由于错误而提前终止,则只读变量 GPVAL_ERRNO 将设置为非零值。最新的错误信息存储在字符串变量 GPVAL_ERRMSG 中。 GPVAL_ERRNO 和 GPVAL_ERRMSG 都可以使用命令reset errors清除。

具有鼠标功能的交互式终端,使用 "MOUSE_" 维护其只读变量。详情参见鼠标变量

拟合机制使用 "FIT_" 开头的若干变量。最安全的办法就是避免使用这样的名字。当使用set fit errorvariables时,每个拟合参数的错误存储在该参数名后附加 "_err" 的变量中。详情参见fitset fit文档。

参见用户定义的变量,reset errors,鼠标变量fit

用户定义的变量和函数

可以在任何地方定义新的用户变量和函数,包括plot命令本身。用户定义的函数最高可使用 12 个变量。

用户定义函数的语法

<func-name>( <dummy1> {,<dummy2>} ... {,<dummy12>} ) = <expression>

其中<expression>是根据<dummy1><dummy12>定义的。

用户定义变量的语法

<variable-name> = <constant-expression>

示例

      w = 2
      q = floor(tan(pi/2 - 0.1))
      f(x) = sin(w*x)
      sinc(x) = sin(pi*x)/(pi*x)
      delta(t) = (t == 0)
      ramp(t) = (t > 0) ? t : 0
      min(a,b) = (a < b) ? a : b
      comb(n,k) = n!/(k!*(n-k)!)
      len3d(x,y,z) = sqrt(x*x+y*y+z*z)
      plot f(x) = sin(x*a), a = 0.2, f(x), a = 0.4, f(x)

      file = "mydata.inp"
      file(n) = sprintf("run_%d.dat",n)

最后两个例子演示了用户定义的字符串变量和用户定义的字符串函数。

请注意,变量pi(3.14159...) 和NaN(IEEE "Not a Number",意为“不是一个数字”) 已经被定义。如果你真的需要,也可以重新定义他们。原始值可通过下面的设置来恢复:

      NaN = GPVAL_NaN
      pi  = GPVAL_pi

其他变量可以在各种 gnuplot 操作下定义,如在交互式终端或拟合中进行鼠标移动,详情参阅gnuplot 定义的变量

可以通过exists("V")表达式检查给定变量 V 是否存在。例如

      a = 10
      if (exists("a")) print "a is defined"
      if (!exists("b")) print "b is not defined"

有效名称与大多数编程语言相同:必须以字母开头,但后续字符可以是字母、数字或者 "_"。

每个函数定义都可用前缀 'GPFUN_' 变成特殊的字符串值变量。

示例

  set label GPFUN_sinc at graph .05,.95

参见show functions,functions,gnuplot-defined variables,macros,value

数组

数组被实现为用户变量的索引列表。数组中的元素不限于单一类型的变量。在被引用之前,数组必须被显式创建。创建之后无法改变数组的大小。所有元素初始都是未定义的。在大多数情况下,数组元素可用于代替命名的用户变量。数组 A 的基数(元素数量)由表达式|A|给出。

示例

     array A[6]
     A[1] = 1
     A[2] = 2.0
     A[3] = {3.0, 3.0}
     A[4] = "four"
     A[6] = A[2]**3
     array B[6] = [ 1, 2.0, A[3], "four", , B[2]**3 ]

     do for [i=1:6] { print A[i], B[i] }
         1 1
         2.0 2.0
         {3.0, 3.0} {3.0, 3.0}
         four four
         <undefined><undefined>
         8.0 8.0

注意:数组和变量共享相同的命名空间。例如,一个名为 FOO 的字符串变量的分配,将破坏之前创建的数组 FOO。

数组名可用于plot,splot,fit或者stats命令。这相当于提供一个文件,其中列 1 保存数组索引 (从 1 到数组大小) 而列 2 保存A[i]的值。

示例

     array A[200]
     do for [i=1:200] { A[i] = sin(i * pi/100.) }
     plot A title "sin(x) in centiradians"

为了在绘图时保留复数数组值得虚部分量,值必须以A[$1]引用,而不是$2。例如

 plot A using (F1(real(A[$1])) : (F2(imag(A[$1]))

results matching ""

    No results matching ""