見出し画像

C++を用いたデータ解析1日目

今回は、「わかりやすいデータ解析入門-C++による演習」をすすめていく。

その前にまずはLinuxの基本操作だが、ターミナルをさわったことのない人はなんのこっちゃの内容だと思うが、わかりやすく素晴らしい説明がすでにあるのでそこをご覧いただきたい。

ディレクトリについて知りたい方はこちら。

基本コマンドを知りたい方はこちら。


ここから、本題のC++を使ったデータ解析について書いていく。

実行環境の確認:エディタはemacs 26.3、実行はmacOSのターミナル

余談だが、Windowsではコマンドプロンプト、macOSではターミナル、Linuxではシェルとよぶらしい。


プログラミングは、以下の3つのサイクルを繰り返す。

1.ソースコードの作成・修正

2.コンパイル

3.実行


では、それぞれの詳しい手順を見ていこう。

1.ソースコードの作成・修正

①データファイルを作成する

data1D.dat

スクリーンショット 2020-05-05 16.37.54

②ソースコードを作成

read1D.cpp

// read1D.cpp

#include <iostream>

#include <fstream>

#include <string>

#include <vector>

using namespace std;
int main(int args, char* argv[]){
 string fname1 = argv[1];
 int i = stoi( argv[2] );
 vector<double> vec;
 double val;
 ifstream ifile1( fname1 );
 while( ifile1 >> val ) vec.emplace_back(val);
 ifile1.close();
 cout << vec[i] << endl;
}

③保存(拡張子に気をつけることと、同じ場所にすること)


2.コンパイル

 ターミナルを開き、下記コマンドを入力し実行ファイルを作成する。

g++ -std=c++11 read1D.cpp -o read1D

・g++ C++のコンパイラコマンド(version4.8以降)

・-std=c++11 乱れた乱数などC++11規格の標準ライブラリを利用する

・read1D.cpp 先ほど作成したC++ファイル(拡張子は.cpp)

・-o read1D 「-o filename」で記述する。出力ファイルや実行可能ファイルの名前をfilenameに書く


3.実行

ターミナルに実行コマンドを入力する

./read1D data1D.dat 0

・ ./read1D カレントディレクトリ(現在のディレクトリ)にあるread1Dというファイルを実行

・data1D.dat 第一引数にデータファイルを指定

・0 第二引数には、表示する配列のindex(=添字)を指定


すると実行結果は1が返ってくる。

1

第二引数に1を入れると、実行結果は2となり、2を入れると実行結果は3となる。ためしに、3や10を入れてみたが、実行結果はどちらも0であった。

スクリーンショット 2020-05-05 14.09.14


次は違うデータを扱ってみる。

data2D.dat

スクリーンショット 2020-05-05 17.03.21

read2D.cpp

// read2D.cpp

#include <iostream>

#include <fstream>

#include <string>

#include <vector>

using namespace std;
int main(int argc, char* argv[]){
 string fname1 = argv[1];
 int i = stoi( argv[2] );
 vector<vector<double>> vecs;
 double x, y;
 ifstream ifile1( fname1 );
 while( ifile1 >> x >> y ){
   vector<double> vec = {x,y};
     vecs.emplace_back(vec.begin(),vec.end());
 }
 ifile1.close();
 cout << vecs[i][0] << " " << vecs[i][1] << endl;
}


コンパイルと実行結果

スクリーンショット 2020-05-05 14.30.52


実はターミナルからコンパイルするより少し効率の良い方法がある。emacsからコンパイルする方法である。

①Makefileの作成

Makefile

CXX = g++
CXXFLAGS = -std=c++11 -O3

※オプションの -O3は、大文字のオーである。

②ターミナルにmakeコマンドの入力

makeコマンドは、「make ターゲット」と記述する。実行時にMakefileを参照する。

$ make read1D
g++ -std=c++11 -O3 read1D.cpp read1D

※こちらもオプションの -O3は、大文字のオーである。

③emacsからのコンパイル

emacsからread1Dを開き、画面下に"Altキー + x compile"と入力する。

スクリーンショット 2020-05-05 14.54.52

すると、ミニバッファに"compile command : make -k"と表示される。これは、コンパイルコマンドを完成させよと促しているので、read1Dを入れEnterキーを押す。

スクリーンショット 2020-05-05 14.54.52

emacsからコンパイル&実行するメリット:ソースコード内のエラーに"Ctrlキー+x"で順次移動できる。

よろしければサポートお願いします。いただいたサポートを皆さんに還元していきたいと思っております。