pythonistaがC++で複素数の配列を扱ってみる.
目次
はじめに
どうも,かわつあんです.前回は複素数C++で扱って,前々回は配列を扱いました.今回は複素数の配列をちょこっと触ってみます.
まずはじめに断っておくと,C++の複素数配列はデフォルトの配列やarray
クラスでも複素数を扱えるようです.しかし,私はvector
の方が便利だと個人的に感じたので,今後vector
で配列を扱っていく予定です.
では,いきましょう〜
C++で複素数の一次元配列
それではC++での複素数配列をvector
クラスで扱っていきます.
それでは早速適当な複素数の配列を生成してみたいと思います,と言いたいところですが,その前に比較のためにpythonだとどう書くかを書いておきます.
import numpy as np zary = np.array([1+1j, 2+2j, 3+3j]) print(zary)
出力結果
[1.+1.j 2.+2.j 3.+3.j]
こんな感じです.
listのままでもいいですが,numpy.ndarray
の方がブロードキャストなどを使って計算しやすいですよね.
次はC++で同じことをやってみます.
#include <iostream> #include <complex> #include <vector> using namespace ::std; int main(){ vector<complex<float> > zary; zary.push_back(complex<float>(1,1)); zary.push_back(complex<float>(2,2)); zary.push_back(complex<float>(3,3)); cout << zary[0] << endl; cout << zary[1] << endl; cout << zary[2] << endl; }
出力結果
(1,1) (2,2) (3,3)
無事に複素数の配列を生成できました.vector<型>
というふうに定義するため,
型
のところに,complex<float>
などを入れればいいみたいです. しかし,なぜかvectorの初期化がpush_back以外ではできなかったです...
=>できました!C++14でコンパイルするとできました.以下にその時のコードを貼っておきます.
#include <iostream> #include <complex> #include <vector> using namespace ::std; int main(){ vector <complex<float> > zary={complex<float> (1,1), complex<float> (2,2), complex<float> (3,3)}; cout << zary[0] << endl; cout << zary[1] << endl; cout << zary[2] << endl; }
コンパイル時に以下のようにオプションをつけました.
c++ complex.cpp -std=gnu++14
C++は11と14でいろいろ違うみたいですね. そこら辺は今後に気をつけていきます.(たまにコンパイルできてたのは,たまたまc++14を使ってたのか?)
C++で複素数の二次元配列
二次元配列も一次元配列と同じようにできるので,pythonとc++を比較で一気に書いちゃいます.
pythonだと
import numpy as np zary = np.array([[1+1j, 2+1j, 3+1j], [1+2j, 2+2j, 3+2j], [1+3j, 2+3j, 3+3j]]) print(zary)
実行結果
[[1.+1.j 2.+1.j 3.+1.j] [1.+2.j 2.+2.j 3.+2.j] [1.+3.j 2.+3.j 3.+3.j]]
C++だと
#include <iostream> #include <complex> #include <vector> using namespace ::std; int main(){ vector <vector <complex<float> > > zary; zary={{complex<float> (1,1),complex<float> (2,1),complex<float> (3,1)}, {complex<float> (1,2),complex<float> (2,2),complex<float> (3,2)}, {complex<float> (1,3),complex<float> (2,3),complex<float> (3,3)} }; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ cout << zary[i][j] << " "; } cout << endl; } }
実行結果
(1,1) (2,1) (3,1) (1,2) (2,2) (3,2) (1,3) (2,3) (3,3)
無事に,pythonと同じようにc++でも複素数の配列を使えるようになりました.pythonはやっぱり簡単だし,c++はやっぱり書くのがめんどくさいですね.まあ,それぞれの言語のコンセプトに合っていると思いますので,しょうがないと思います.
さいごに
今回は,複素数の配列をC++で扱い,pythonと比べてみました. C++でも慣れれば難しくなく(書くのはすごく面倒ですが)複素数の配列を扱えるみたいですね.
これまでの記事を通して,C++である程度は計算ができるようになりました.今後は早速C++で計算をしようと思いますが,最終的なゴールであるC++ をpythonから呼ぶためには,配列をポインタかあるいは参照で扱わないといけません.せっかくなので,ポインタと参照についてC++とpythonで比較して,次回まとめようかと思います.
ではまた(✿╹◡╹)