データの書き込み
ここでは,データの生成は C++
で行う.生成するデータとしては,以下の関数を用いる.
$$ y = \mathrm{e}^{-x} \cos x \qquad (0 \leqq x \leqq 10)$$
以下に C++
で書いたコードを載せる.
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
// 実行する前に、dataという名前のフォルダを用意しておく
std::string filename = "result.bin"; //出力ファイル名
int main()
{
int n = 1000;//データ数
double y[n+10];
for (int i=0; i<n; i++)
{
y[i] = std::exp((double) -i/100) * std::cos((double) i/100);
}
std::ofstream fout;
fout.open( "./data/" + filename, std::ios_base::out|std::ios_base::binary|std::ios_base::trunc);
if (!fout) //ファイルが存在しない場合の処理
{
std::cout << "cannot open the file" << std::endl;
return 1;
}
for (int i=0; i<n; i++)//0,1,...,n-1
{
fout.write((char *)&y[i], sizeof(double));
}
fout.close();
return 0;
}
データの読み込み
バイナリファイルの読み込みはnumpy
を用いて次のように行う.
filename = "./data/result.bin" #ファイルのディレクトリを指定
x = np.arange(1000)
y = np.fromfile(filename, dtype='float64') #今回はdouble型なのでfloat64を指定
可視化
可視化に関しては好きなように記述したら良いと思うのだが,ここではmatplotlib
を使った例を示す.
fig = plt.figure(figsize=(8,6)) #サイズを指定
plt.plot(x, y, label='$y=e^{-x}\cos x$', linestyle='--', color='blue') #描画
plt.grid(which='major',color='black',linestyle='-') #グリッド線の追加
plt.xlabel('$x$', fontsize=20)
plt.ylabel('$y$', fontsize=20)
# plt.title('title', fontsize=20)
plt.legend(fontsize=20)
plt.tick_params(labelsize=20)
# plt.savefig('./Image/image.png') #データの保存
出力される図の例を以下に示す.
おわりに
今回は C++
で生成したデータをバイナリデータとしてファイルに書き込み,そのデータを Python で読み込んで可視化することを行った.単にグラフを描くだけならば,Python で完結すればよいのだが,バイナリファイルの取り扱いを勉強したかったので,このような内容にした.なお,周囲の C / C++ ユーザに聞くと,データをテキストファイル(もしくはバイナリファイル)に書き込み,gnuplot によって可視化する場合が多いようである.
更新履歴
- 2020.05.14:
C++
のコードに一部誤りが含まれていたので修正 - 2020.05.14:データの読み込みの部分に
x
に関する記述がなかったので追記 - 2020.05.14:グラフが正しく貼られていなかったため修正