Eigen
v3.4からスライスが便利になるそうだが、最新Stable版の利用を前提にする。
時期が来たらこっそりエントリー書き換えるかも。
git clone https://gitlab.com/libeigen/eigen.git
git checkout tags/3.3.7
導入
#include <Eigen/Core>
using namespace Eigen;
基本
ベクトル - 1D Array - Vector
- numpyのデフォルトはfloat64(=double)らしいので、それに倣う。
Numpy | Eigen | |
---|---|---|
配列確保 | a = np.empty(size) | VectorXd a(size); |
ゼロベクトル | a = np.zeros(size) | VectorXd a = VectorXd::Zero(size); |
1ベクトル | a = np.ones(size) | VectorXd a = VectorXd::Ones(size); |
fill | a.fill(1) | a.fill(1); |
ベクトル長 | a.shape[0] | a.size(); |
要素アクセス | a[0] a[-1] |
a(0) a(a.size()-1) |
スライス・アクセス | a[a:a+n] a[:n] a[-n:] |
a.segment(a,n) a.head(n) a.tail(n) |
要素べき乗 | a**n a**2 |
a.array().pow(n) a.array().square() |
要素ルート | a**0.5 | a.array().sqrt() |
要素総和 | np.sum(a) | a.sum() |
行列 - 2D Array - Matrix
- Eigenは列ベクトル(デフォルト)。numpyは行ベクトル(デフォルト)。
- 列ベクトルはFortran contiguous方式、行ベクトルはC contiguous方式。
Numpy | Eigen | |
---|---|---|
配列確保 | a = np.empty((r,c)) | MatrixXd a(r,c); |
ゼロ行列 | a = np.zeros((r,c)) | MatrixXd a = MatrixXd::Zero(r,c); |
1s 行列 | a = np.ones((r,c)) | MatrixXd a = MatrixXd::Ones(r,c); |
サイズ | a.shape | a.rows(), a.cols() |
要素アクセス | a[r,c] | a(r,c) |
スライス・アクセス | a[r:r+n,c:c+m] | a.block<n,m>(r,c) a.block(r,c,n,m) |
列アクセス | a[r] | a.row(r) |
行アクセス | a[:,c] | a.col(c) |
flatten#1 | a.flatten('F') | Map<const VectorXd>(a.data(), a.size()) |
flatten#2 | a.flatten() | MatrixXd b = a.transpose(); Map<const VectorXd>(b.transpose().data(), b.size()); |
reshape - MatrixXdのみ |
a.reshape((r,c)) | a.resize(r,c) // 非破壊でreshapeするなら a.reshaped(r,c) |
reshape | a.reshape((r,c)) | MatrixXd x = Map<Matrix<double, r, c>>(a.data()); |
transepose | a.T | a.transpose() |
逆行列 | np.linalg.inv(a) | a.inverse() |
配列構築・スニペット系
Eigenにはないnumpy/scipyの便利関数たち
Numpy | Eigen | |
---|---|---|
vstack | np.vstack([a, b]) |
|
hstack | np.hstack([a, b]) |
|
対角行列 | np.diag([0, 1, 2, 3]) |
|
block Diag | # Scipy | # numpycpp参照 |
No comments:
Post a Comment