2012-11-13 74 views

回答

2

是的,它是可能的gnuplot的直接 - 它只是不容易:

firstval = NaN 
yi1(yi) = (returnval=firstval, firstval=yi, returnval) 
plot "datafile" using 1:((yi1($2)-$2)/returnval) 

您需要使用內聯函數。內聯函數的形式如下:

funcname(args,...) = (statement1,statement2,...,statementn, return_value) 

這裏我只是創建了一個函數來保存它傳遞的最後一個值。不幸的是,這個解決方案變得更難看了一點,因爲在使用規範中我不能調用yi1兩次(第二次,我會得到錯誤的返回值),所以我不得不直接引用保存返回值的變量。這並不漂亮,但它的工作原理。通過傳遞$0(行號),你可能會「漂亮」一點,只有當$ 0改變時纔會更新,但它可能不值得這個黑客。

+0

非常聰明!謝謝! – Martin

0

直接在gnuplot中做到這一點很棘手。問題是你必須在你的計算中使用第(i-1)個元素,這個gnuplot不能自動完成。它可以做簡單的計算,但只能在同一行上,例如類似於

plot "datafile" using ($1):(($2-$1)/$2) 

會很容易。

對於您需要做的事情,我建議您使用octave,或者您可以使用電子表格應用程序準備數據文件。

在八度,你可以繪製此類似:

d = load("datafile") 
plot(d(2:end, 1), d(1:end-1, 2)-d(2:end, 2)./d(1:end-1, 2)) 
+0

如果您只想使用gnuplot(請參閱我的解決方案),則可以執行此類操作,但如果您需要i-2或i-3元素,則很快會變得很麻煩。我無法檢索到i + 1和i + 2元素(但這並不是太多問題 - 只需轉換索引:)。 – mgilson

+0

@mgilson - 沒有想到這樣的解決方案:)我看到的唯一問題是,如果不重新設置'firstval',你就無法做'replot' – mata

+0

絕對正確 - 儘管我並沒有真正發現自己重新繪製這些日子經常。 – mgilson

相關問題