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++複素数の二次元配列

二次元配列も一次元配列と同じようにできるので,pythonc++を比較で一気に書いちゃいます.

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で比較して,次回まとめようかと思います.

ではまた(✿╹◡╹)