About
Contents
STL
Android
Eigen
enchant.js
Firefox OS
OpenGL
OpenGL ES 2.0
pukiwiki
UE4
Unity
Windows Phone
Xamarin
Materials Link
その他
PR
STL
Android
Eigen
enchant.js
Firefox OS
OpenGL
OpenGL ES 2.0
pukiwiki
UE4
Unity
Windows Phone
Xamarin
行列のメモリ配置の変更方法や、ベクトルの操作についてです。
行列はAPIによってメモリ配置(列優先か行優先か)が異なります。例えばOpenGL系は列優先、DirectX系が行優先だったりします。 Eigenではメモリ配置を変えることができます。
void memoryReplaceMatrix() { //デフォルトは ColMajorになっている。 Matrix3f matDefault; Matrix<float, 3, 3, RowMajor> matA; Matrix<float, 3, 3, ColMajor> matB; // カンマオペレータによる初期化はメモリの配置順に依存しない。 matDefault << 1, 2, 3, 4, 5, 6, 7, 8, 9; matA << 1, 2, 3, 4, 5, 6, 7, 8, 9; matB << 1, 2, 3, 4, 5, 6, 7, 8, 9; // メモリの配置順に出力。 for (int i = 0; i < matDefault.count(); ++i) { Log( matDefault(i) ); } for (int i = 0; i < matA.count(); ++i ) { Log( matA(i) ); } for (int i = 0; i < matB.count(); ++i) { Log( matB(i) ); } }
void diagonalMatrixVector() { // 対角行列を作成する。 Matrix3f matB; matB << 1, 2, 3, 4, 5, 6, 7, 8, 9; MatrixXf matC = matB.diagonal(); Log(matC); // ベクトルから対角行列を作成する。 Vector3f vec; vec << 1, 2, 3; Matrix3f matA = vec.asDiagonal(); Log(matA); }
void transposeMatrix() { Matrix3f matA; matA << 1, 2, 3, 4, 5, 6, 7, 8, 9; Log(matA); Matrix3f matB = matA.transpose(); Log(matB); }
void reductionMatrix() { Matrix3f matA; matA << 1, 2, 3, 4, 5, 6, 7, 8, 9; std::cout << "Sum matA : \n" << matA.sum() << std::endl; std::cout << "Prod matA : \n" << matA.prod() << std::endl; std::cout << "Mean matA : \n" << matA.mean() << std::endl; std::cout << "minCoeff matA : \n" << matA.minCoeff() << std::endl; std::cout << "maxCoeff matA : \n" << matA.maxCoeff() << std::endl; std::cout << "Trace matA : \n" << matA.trace() << std::endl; }
void divReductionMatrix() { Matrix3f matA; matA << 1, 2, 3, 4, 5, 6, 7, 8, 9; std::cout << "Sum matA : \n" << matA.rowwise().sum() << std::endl; std::cout << "Prod matA : \n" << matA.rowwise().prod() << std::endl; std::cout << "Mean matA : \n" << matA.rowwise().mean() << std::endl; std::cout << "minCoeff matA : \n" << matA.colwise().minCoeff() << std::endl; std::cout << "maxCoeff matA : \n" << matA.rowwise().maxCoeff() << std::endl; }
void NormVector() { Vector3f v; v << 1, 2, 3; std::cout << "v.squaredNorm() = " << v.squaredNorm() << std::endl; std::cout << "v.norm() = " << v.norm() << std::endl; std::cout << "v.lpNorm<1>() = " << v.lpNorm<1>() << std::endl; }
void NormMatrix() { Matrix3f m; m << 1, 2, 3, 4, 5, 6, 7, 8, 9; std::cout << "m.squaredNorm() = " << m.squaredNorm() << std::endl; std::cout << "m.norm() = " << m.norm() << std::endl; std::cout << "m.lpNorm<1>() = " << m.lpNorm<1>() << std::endl; }