2016-11-18 73 views
1

有沒有辦法指定輸入數據是需要評估的表達式?Gnuplot:輸入數據中的表達式

在我的情況下,數據是以「n/d」格式編碼的有理數。有沒有辦法告訴gnuplot將「n/d」解釋爲「n除以d」?

實施例的輸入數據:

1/9 1 
1/8 2 
1/7 3 
1/6 4 

我試圖plot "data" using ($1):2但這截斷的 「n/d」 到 「n」。

更新:在手冊中一些挖後,我發現,在這種情況下,我可以告訴gnuplot的解釋「/」作爲柱分離器,然後通過所述第二劃分所述第一數目如下:plot "data" using ($1/$2):3 '%lf/%lf %lf'

+0

不錯。把你的更新放在答案中。 – maij

+0

@maij我希望有一種方法可以告訴gnuplot解釋任何算術表達式,但顯然這是不可能的。 – badweather

回答

2

我不知道一個gnuplot唯一的答案。但是,您可以使用system命令讓另一個程序執行此操作。例如linux上的bc程序。下面的腳本對我的作品:

result(s) = system(sprintf('echo "%s" | bc -l ~/.bcrc', s)) + 0 

set table "data.eval" 
plot "data.dat" using 1:(result(strcol(2))) 
unset table 

這是數據文件:

1 1/2  
2 1/2.0 
3 4+4  
4 4*5-1 
5 4*(5-1)-(3-7) 
6 sin(3.1415) 

這是輸出:

# Curve 0 of 1, 6 points 
# Curve title: ""data.dat" using 1:(result(strcol(2)))" 
# x y type 
1 0.5 i 
2 0.5 i 
3 8 i 
4 19 i 
5 20 i 
6 9.26536e-05 i 

注:

  • set table "data.eval"將值打印到文件中,現在更容易檢查結果。
  • strcol(2)以字符串形式讀取第二列的條目。該表達式不得包含空格。
  • 功能result將字符串傳送到bc。字符串本身必須被引用,否則shell會像數據文件的第5行或第6行那樣抱怨括號。
  • bc上的選項-l可以像第一行那樣對錶達式進行浮點計算(1/2 = 0.5而不是1/2 = 0),並且它爲sine和e(x)定義s(x)爲exp(x)。
  • ~/.bcrc讀取一些函數定義
  • system命令返回一個字符串。通過添加0將該字符串升級爲浮點數。

我的〜/ .bcrc看起來是這樣的:

pi=4*a(1) 
e=e(1) 

define ln(x) 
{return(l(x))} 

define lg(x) 
{return(l(x)/l(10))} 

define exp(x) 
{return(e(x))} 

define sin(x) 
{return(s(x))} 

define fac(x) 
{if (x<=1) return(1); 
     return(fac(x-1)*x)} 

define ncr(n,r) 
{return(fac(n)/(fac(r)*fac(n-r)))} 

與gnuplot的4.6和BC 95年6月1日在Debian傑西測試。在Windows上,您有用於整數計算的set命令。 Google似乎知道其他一些命令行計算器。