web-dev-qa-db-ja.com

GNUplotで配列を定義してアクセスする方法は?

これはかなり簡単な質問です。しかし、私はすでにこれらを行う方法を見つけようとしましたが、GNUplotのドキュメントでさえ見つけることができませんでした。 GNUplotのarrayコンセプトについて、私の間違いか、誤解している可能性があります。私の質問は、GNUplotで配列を定義してアクセスする方法ですか?

配列宣言の簡単な例を提供し、ループに配列の値を割り当ててください。それで十分だと思います。これは他の人にも役立つと思います。

13
fronthem

(5.1の開発ツリーが配列変数をネイティブでサポートするようになったため、この回答は次の安定したgnuplotリリースでは廃止されます。)

Gnuplotの「splot」コマンドは、キーワード「array」を使用して、3Dプロットの関数値を含むNxM行列のサイズを定義します。

プログラマーがC、Pascal、Pythonなどから知っているような配列は、現在のgnuplot(gp5.0)には存在しません。それらは、任意の(たとえば、適合された)パラメーターを使用して曲線のファミリーをプロットするのに非常に役立つため、1日で実装される可能性があります。

Gnuplotで配列について必死になっている場合は、Word()関数(およびその他の文字列関数)を(ab)使用して、多少限定された置換を実現できます。また、少し面倒です。

array = ""
f(a,x) = a*x
do for [i=1:5] {array = array.sprintf(" %.3f",i+Rand(0)) }
print "array = ".array
set xr [0:]; set yr [0:30]
plot for [i=1:5] f(Word(array,i),x) title Word(array,i)." x"

この例では、一連の乱数を "array"という名前の文字列変数に書き込み、その後、それを使用して、 "array"内の数値を傾斜に使用する5つの線形関数をプロットします。

8
Karl

Gnuplot 5.1以上を使用しており、1次元の配列が必要な場合は、サイズがNの配列を定義し、インデックスが1からNになることを思い出してください。

gnuplot> array A[3] #Array definition
gnuplot> A[1]=2
gnuplot> A[3]=4
gnuplot> print A[1]
2
gnuplot> print A    #Print the array, with empty A[2]
[2,,4]

複数の次元が必要な場合、または以前のバージョンのGnuplotを使用している場合は、以下を実行できます。

以前のバージョンのGnuplotにはベクトル変数がないため、2つの関数を定義して、名前にインデックスが含まれる背後の変数に値を取得および設定できます。関数は次のとおりです。

aGet(name, i) = value(sprintf("_%s_%i", name, i)) 
aSet(name, i, value) = sprintf("_%s_%i = %.16e", name, i, value)

配列Aに値を割り当てて取得するには、次のようにします。

eval aSet("A",2,3)
print aGet("A",2)

これらの関数が行うことは、_A_2という変数にアクセスすることです。

同様の関数を作成して、行列を操作できます。

mGet(name, i, j) = value(sprintf("_%s_%i_%i", name, i, j)) 
mSet(name, i, j, value) = sprintf("_%s_%i_%i = %.16e", name, i, j, value) 
9
bmello

@Karlの回答に触発されて、Word関数を別の関数に入れると、配列のように見えます。

array(n) = Word("1 2 3 4 5 6 7 8 9", n)
print array(3)

これは3。したがって、索引付けは1ベースです。

arrayを2で「乗算」:

print (b="", sum[i=1:9](b=b.(array(i)*2)." ", 0), b)

これは2 4 6 8 10 12 14 16 18。ここで、sum関数は配列をループするために(ab)使用され、その結果は無視されます。

そして、@ bmelloの答えのあまり一般的ではないバリエーションを通じて、ここでは短くなっています:

A_1=1.1; A_2=2.2; A_3=3.3
A(i) = value("A_".i)
print A(3)

私にとっては、より直感的に感じます。アンダースコア_は単にset関数と見なすことができます。また、整数インデックスに限定されません。文字列も可能で、辞書のような動作をします。

3
Friedrich