Gnuplot脚本执行最后一行报错')' expected,调数组定义位置后正常求因
Gnuplot脚本报错')' expected的原因与解决
问题说明
在Gnuplot 5.4 patch level 8(Windows 10系统,QT终端)中,执行脚本最后一行stats N using (M_x_N[int($0+1)] = N[int($0+1)]*M[int($0+1)]) name "M_x_N" nooutput时,会触发')' expected语法错误;但将array M_x_N[numRecord]的定义位置调整到该行之前(注:原脚本中已提前定义,实际问题源于stats命令的误用)即可消除报错。
核心原因
- stats命令语法误用:
stats命令的第一个参数应为数据文件路径,而非已定义的数组。你试图用stats直接处理数组N,不符合Gnuplot语法规范,导致解析器误判括号匹配逻辑,抛出错误。 - 版本解析优先级问题:Gnuplot 5.4.8在处理stats命令中引用数组时,存在语法解析优先级bug,调整数组定义位置后,解析器能正确识别数组标识符,暂时规避了错误,但未解决stats误用的根本问题。
正确解决方法
既然已经通过前两个stats命令将数据读入数组M和N,无需再用stats计算乘积数组,改用do for循环遍历数组元素即可:
reset session set encoding utf8 set datafile separator comma cd 'C:\Users\smallz4' corpusFile = "lz4_silicia_corpus.txt_4096.csv" stats corpusFile nooutput numRecord = STATS_records chunkSize = numRecord-15.0 bias = 2048.0 array M[numRecord] array N[numRecord] array M_x_N[numRecord] stats corpusFile using (M[int($0+1)] = $1) name "M" nooutput stats corpusFile using (N[int($0+1)] = $2) name "N" nooutput # 替换原stats命令,用循环计算乘积数组 do for [i=1:numRecord] { M_x_N[i] = M[i] * N[i] }
替代方案(直接用stats计算)
如果无需提前将数据读入数组,可直接从数据文件读取两列计算乘积并统计,无需定义数组:
stats corpusFile using (M_x_N = $1*$2) name "M_x_N" nooutput # 可通过M_x_N_sum等变量获取统计结果
内容的提问来源于stack exchange,提问作者Guy B
相关产品推荐
相关产品推荐

