Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

快適なC++生活のためにスクリプト言語を使おう5 - 数値データの確認にはSpyder統合環境を使おう -

More than 3 years have passed since last update.

数値データの確認には、グラフを作図するのが有効なことがあります。
あなたがPython使いの場合には、matplotlibというライブラリを紹介を受けて使っていることでしょう。

しかし、C++使いの場合には、MATLABやmatplotlib並みの作図ができるグラフライブラリを標準的に共通に使っているというにはいたっていないように見えます。[注] (C++使いでも、MATLABやmatplotlib並みの作図ができるグラフライブラリを使っていらっしゃる方は多いと思います。ただ、それが全てのC++使いに共通のノウハウにはなっていないと、経験的に感じています。)

そこで今回はC++使いの方々に、Spyder統合環境を利用して 数値データを扱うことを紹介します。(MATLABRなどのツールを使いこなしている方は、選択肢の1つが増えるだけです)

数値計算のプログラムでは
コンパイルしてビルドが通って、実行できたからといってプログラム開発が終わることはありません。
実行した結果の値が適切であることを確認する作業がいわば仕事の始まりです。
どういう値が返ってくれば正しいのかが分かる入力を使って計算を行います。

正しいことがわかっている簡単な例でまず確認しよう

数値計算のプログラムの妥当性を検証する手法は、どんなにつまらないものでも、数多く考えてみることです。答がわかっている問題を数多く解いていくことが、問題を見つけることにつながります。
計算結果の行列を見やすくします。PythonのSpyder統合環境をnumpyやmatplotlibなどを使って、表示させます。
試行錯誤する段階では、対話的に使える環境を使って、妥当性の確認をしましょう。

ちょっとだけ難しくした例を試してみよう

(要追記)

ノイズのあるデータでの結果を確認しよう

(要追記)

これらの作業をMatplotlibのようなツールなしに確認するのは手間です。どんなにC++のコーディングが得意であっても、C++以外のツールを使いこなすべきです。C++でそれだけのグラフを作れる人は、その労力をもっと認められる分野に使うべきです。

Matplotlib

1.まず、Matplotlibなどのライブラリで何ができるのか例題を見てみよう。

Matplotlibの例題を数多くみることです。そうすると、中には自分の作図したい内容と類似したものがあるはずです。

2.次に入力データを置き換える方法を学ぼう。
私の場合は、他のプログラムの出力結果を行列を受け取るなら
numpy.loadtxt()

画像ファイルを受け取るなら
cv2.imread()
を使います。

 そのような、入力データの差し替えをすることが、データ解析の力をつける最初の一歩です。

3.matplotlibを使う例題をscikit-learnやscikit-imageで数多く試してみよう。
 scikit-learnscikit-imageの例題を数多く実行してみましょう。これらのサイトで用意されている例題は、全てデータ付です。そのため、それらの例題を数多く実行してみましょう。matplotlibが、複数のグラフを1枚のプロットに見やすく作ってくれることなどを経験してみてください。

4.そのようにして身につけたグラフの作成能力を、あなたの抱えている問題にあてはめてみてください。

あなたの数値計算の確認が進んで、よい結果にたどりつきますように。

OpenCVの中で無理やりグラフを作らない方がよいと考える理由

数値データをOpenCVのimshow()やimwrite()で扱ってグラフ化する例はあります。しかし課題はいろいろあります。
・ 0-255の範囲にするためのコードを自分で書かなくてはならない。
・ 値を示すcolorbarがない。
・ 100と110の違いと、200と210との違いとを分かりやすくする方法がない。
・ 0と1の違いを見やすくするのが手間である。
・ 気の利いたグラフを作るように機能を追加していくごとに
  メンテナンスしなければならない自作ライブラリを背負い込むことになってしまう。
C/C++からグラフを作成しなければならないときに、私などがよく用いる手法の一つは
pythonスクリプトで引数を与えれば、グラフを生成して保存するように作っておく。
それを
system("python myscript.py datafile.txt")
などとして実行することです。
そうすると、C/C++のソースコードで無理やり配列データを0-225のグレースケール画像などに書かなくて済むようになります。

[注]
C++使いの場合、開発環境のOSが違っていることや、ライセンスなどの問題のために、誰もが気がいるに使える共通のライブラリは、あまり普及していないように見えます。C++では組み込みからハイエンドまでどのような種類のCPUやOSでも対応することや、GUIのライブラリもまちまちであるのでやむをえない事情があるのもわかります。
 一部のC++使いの場合には、他のソフトウェア言語の便利な機能を知ることがなく、データや妥当性の確認に手間どってしまっていることが見受けられます。

MATLABは、ライセンスが維持できる限りとても有用です。ところがいったん、組織内の部署を移動しただけで、とたんにライセンスが利用できなくなったりします。

nonbiri15
Python, scikit-learn, OpenCV使いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away