我有几个函数f1(x),f2(x)... fn(x)。 每个函数都适合称为v(i)的数据集 每个都有这种形式,例如:f1(x)= a1 * x 现在我想通过调用for循环
来绘制所有这些plot for [i=i0:ie:di] v(i) using 1:($3)
到目前为止一切顺利。 现在我想为每个i调用a1,a2,a3..etc,例如重新缩放数据,我会像这样写它
plot for [i=i0:ie:di] v(i) using 1:($3/a(i))
,其中
a(i)=sprintf("a%01.0f",i)
问题是从字符串传递给浮点数,然后到gnuplot将其识别为已定义的参数。我试图添加零来进行隐式转换,但它不起作用。即使我打印
print (a(i)+0)
有人有想法获得我的a(i)吗?
非常感谢您的任何建议
感谢您提供真正的功能建议,但我仍然遇到以下问题,可以看作是这个最小的例子
a1=12
a(x)=sprintf("a%01.0f",x)
print real(a(i)) #want to get 12 here
Non-numeric string found where a numeric expression was expected
答案 0 :(得分:1)
您需要使用值功能(请参阅help value
)。 值函数接受一个字符串,并返回其名称为该字符串的变量的值。
例如
a1 = 2
a2 = 3
a3 = 1
plot for[i=1:3] x**value(sprintf("a%d",i)) t sprintf("a%d",i)
产生
此处,对于i的每个值,我们使用sprintf("a%d",i)
建立变量的名称,该变量返回 a1 , a2 或 a3 取决于i的值。为了获得变量的值,我们将该字符串传递给值函数,该函数将字符串视为变量的名称并查找该值。我们看到 a1 的曲线是x ^ 2(因为 a1 是2), a2 的曲线是x ^ 3(如< em> a2 是3), a3 的曲线是x(因为 a3 是1)。
在您的情况下,您可以将 a(i)功能定义为
a(i)=value(sprintf("a%01.0f",i))
然后 a(1)将是 a1 的值, a(2)将是 a2的值等等。通过此更改,您的代码将完全按照书面形式工作。
答案 1 :(得分:-1)
要将字符串转换为float,您可以使用real
函数:
my_val=2.3
my_str=sprintf("%f",my_val)
print my_str # this is a string
print real(my_str) # this is a float
来自help real
:
real(x)
函数返回其参数的实部。
如果x
是一个字符串函数(即返回变量名称的函数),则需要使用value
函数:
a1=12
a(x)=sprintf("a%01.0f",x)
print real(value(a(1)))
P.S。你还有int
函数,它与整数
否则,如果您需要存储数组(gnuplot不具备该数组),您可能需要查看此建议:https://stackoverflow.com/a/35729052/2743307