25 Eylül 2019 Çarşamba

Eigen

Giriş
Eigen kütüphanesi ile linklemek gerekmez. Açıklaması şöyle
Eigen is only a compile-time dependency for your project. No need to redistribute, or ask your user to install, any library.
SparseMatrix İsim Alanı
Şu satırlar dahil edilir.
#include <Eigen/Sparse>
Şu alan adı dahil edilir.
using namespace Eigen;
Constructor
Şöyle yaparız.
SparseMatrix<double> m (50, 50, 0.1);
setFromTriplets metodu
Şöyle yaparız.
Eigen::SparseMatrix<double> m = ...;  
typedef Eigen::Triplet<double> T; 
std::vector<T> v = ...;

m.setFromTriplets(v.begin(),v.end());

DenseMatrix İsim Alanı
Şu satırlar dahil edilir.
#include <Eigen/Dense>
Şu alan adı dahil edilir.
using namespace Eigen;
Array Sınıfı
resize metodu;
Şöyle yaparız.
Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic> arr;
arr.resize(6, 6)
LLT Sınıfı
constructor
Şöyle yaparız.
MatrixXd A(3,3);
A << 4,-1,2, -1,6,0, 2,0,5;
LLT<MatrixXd> lltOfA(A);
MatrixXd L = lltOfA.matrixL(); 
MatrixXd U = lltOfA.matrixU(); 
Map Sınıfı
constructor - buffer
Şöyle yaparız.
boost::iostreams::mapped_file file("foo.bin");
const std::size_t rows = 163840;
const std::size_t columns = 163840;
if (rows * columns * sizeof(float) > file.size()) {
  ...
}
Eigen::Map<Eigen::MatrixXf> matrix(reinterpret_cast<float*>(file.data()), rows, columns);
std::cout << matrix(0, 0) << ' ' << matrix(rows - 1, columns - 1) << std::endl;
matrix(0, 0) = 0.5;
matrix(rows - 1, columns - 1) = 0.5;
EigenSolver Sınıfı
Constructor
Şöyle yaparız.
MatrixXd data = ...;
EigenSolver<MatrixXd> es (data,false);
eigenValue metodu
Şöyle yaparız.
Vector2cd output = es.eigenvalues();
IOFormat Sınıfı
Örnek
Elimizde bir vector olsun
Vector3i foo = ...;
Şöyle yaparız.
IOFormat Fmt(3, 0, "\t", "\n", "", "");
cout << foo.format(Fmt) << endl;
MatrixBase Sınıfı
Giriş
Dense isim alanındaki tüm matrislerin atasıdır. Bu sınıf genelde gerçek matrisi template koda geçerken kullanılır.
Örnek
Şöyle yaparız.
template <typename Derived>
void print_cond(const MatrixBase<Derived>& a) {...}
operator == 
İmzası şöyle
bool operator== (const MatrixBase< OtherDerived > & other) const
Açıklaması şöyle.
Returns true if each coefficients of *this and other are all exactly equal. Warning When using floating point scalar values you probably should rather use a fuzzy comparison such as isApprox() See Also isApprox(), operator!=
Matrix3i Sınıfı
Bu sınıf aslında bir typedef. Şöyle yaparız.
Matrix3i T;
T << 1, 0, 0,
     0, 2, 0,
     0, 0, 3;
Matrix Sınıfı
Giriş
Şu satırı dahil ederiz.
using Eigen::Matrix;
Tanımlama
Template tanımlarken paramatre olarak T tipi, satır ve sütun sayısı alır.
Örnek
Şöyle yaparız.
#include <iostream>
#include "Eigen/Dense"

using namespace Eigen;

using T = double;

const int rows = 5;
const int cols = 3;

template<typename Derived>
void print_cond(const MatrixBase <Derived> &a) {

  /* We want to enforce the shape of the input at compile-time */
  static_assert(rows == Derived::RowsAtCompileTime);
  static_assert(cols == Derived::ColsAtCompileTime);

  /* Now that we are guaranteed that we have the
   * correct dimensions, we can do something... */
  std::cout << a;
}

int main() {
  print_cond(Matrix<T, rows, cols>::Ones());

  /* These will not compile */
  // print_cond(Matrix<T, rows + 1, cols>::Ones());
  // print_cond(Matrix<T, rows, cols + 1>::Ones());
  // print_cond(Matrix<T, rows + 1, cols + 1>::Ones());
  return 0;
}
Constructor
Şöyle yaparız.
Matrix<double, 2, 2> m;
Ones metodu
Şöyle yaparız.
using T = double;

const int rows = 5;
const int cols = 3;

 auto m  =(Matrix<T, rows, cols>::Ones();
operator () metodu
Şöyle yaparız.
m(0, 0) = 1;
m(0, 1) = 1;
m(1, 0) = 1;
m(1, 1) = 1;
operator + metodu
Şöyle yaparız.
Matrix<Interval, 2, 2> m1;
m1 = m + m;  //this works
operator - metodu
Şöyle yaparız.
Matrix<Interval, 2, 2> m1;
m1 = m - m;  //this works
operator * metodu
Şöyle yaparız.
Matrix<double, 2, 2> m1;
m1 = m*m; //this works
MatrixXd Sınıfı
Giriş
Tanımı şöyle. Dynamic kelimesi boyutların derleme esnasında belli olmadığını gösterir.
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
Constructor - default
Şöyle yaparız.
MatrixXd m
Constructor - size
Şöyle yaparız.
Eigen::MatrixXd m (2,2);
block metodu
2x2 büyüklüğünde bir yeni matris verir. 0. sütun, 0. satırdan başlar. Şöyle yaparız.
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << m << std::endl;

MatrixXd mx(4,4);
mx.block<2,2>(0,0) << m;
mx.block<2,2>(2,2) << m;
std::cout << mx << std::endl;
cwise metodu
Coefficient wise anlamına gelir. Şöyle yaparız.
Eigen::MatrixXd& X = ...;
// take the square of all entries and find max of each row
Eigen::MatrixXd X2 = X.cwise().pow(2);
Eigen::VectorXd max_values = X2.rowwise().maxCoeff();
operator () metodu
Hem getter hem de setter olarak kullanılabilir. Şöyle yaparız.
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << m << std::endl;
operator <<  metodu
Örnek
2x2 matris için şöyle yaparız.
Eigen::MatrixXd m (2,2);
m << 12,3,4,5;
Örnek
2x2 matris için şöyle yaparız.
using Matrix = Eigen::Matrix<Interval, 2, 2>;
Matrix m;
m << 
   Interval {0.0, 1.0},
   Interval {0.0, 0.0},
   Interval {0.0, 0.0},
   Interval {0.0, 1.0};
MatrixXf Sınıfı
Giriş
Şu satırı dahil ederiz.
#include <Eigen/Core>
#include <Eigen/Dense>
Constructor
Örnek
Şöyle yaparız.
MatrixXf m(4,4);
Örnek
OpenCV matrix nesnesinden kurmak için şöyle yaparız.
cv::Mat1f codes;
    ...
Eigen::MatrixXf m = Eigen::MatrixXf(codes.rows,codes.cols);
cv::cv2eigen(codes, m);
Örnek
Şöyle yaparız.
Eigen::MatrixXf m = Eigen::MatrixXf::Random(3,3); //this is OK
Bu çağrıdan önce şöyle yapmak gerekebilir.
std::srand((unsigned int) time(0));
block metodu
2x2 büyüklüğünde bir yeni matris verir. 0. sütun, 1. satırdan başlar. Şöyle yaparız.
cout<<m.block<2,2>(0,1)<<std::endl;
operator * metodu
Şöyle yaparız
int mult_float(const Eigen::MatrixXf& A, Eigen::MatrixXf& B)
{
  Eigen::MatrixXf C= A*B;
  return C(0,0);
}
operator << metodu
Şöyle yaparız.
MatrixXf m(4,4);
    m << 1 , 2 , 3 ,  4,
         5 , 6 , 7 ,  8,
         9 , 10, 11, 12,
MatrixXi Sınıfı
Giriş
Şu satırı dahil ederiz.
#include <Eigen/Core>
operator * metodu
Şöyle yaparız
int mult_int(const Eigen::MatrixXi& A, Eigen::MatrixXi& B)
{
  Eigen::MatrixXi C= A*B;
  return C(0,0);
}
VectorXd Sınıfı
Giriş
Eigen Vector ve std::vector arasındaki farkın açıklaması şöyle
Classes in Eigen represent mathematical objects. In this case, a mathematical vector, with all the typical operations on vectors, like multiplication with a matrix or scalar product.

std::vector is essentially an (dynamic) array, storing a list of data in consecutive space. Typical operations would be appending data or sorting it.
Constructor
Şöyle yaparız.
VectorXd v;
Constructor - size
Şöyle yaparız.
int size = 100;
Eigen::VectorXd v(size);
Constructor - std::vector
Şöyle yaparız.
vector<int> ids = {1, 3, 0, 20};
Eigen::VectorXd v(ids);
setRandom metodu
Şöyle yaparız.
int size = 100;
Eigen::VectorXd v(size);
v.setRandom(size);
VectorXf Sınıfı
Constructor
Şöyle yaparız.
VectorXf v(10); 
Random metodu
Rastgele sayı ile doldurmak için şöyle yaparız.
VectorXf v =VectorXf::Random(n2);
replicate metodu
Elimizde bir vector olsun
Eigen::VectorXf vec(5);
vec << 1, 2, 3, 4, 5;
Şöyle yaparız.
MatrixXf tmp = vec.replicate(1, 3).transpose();
Her elemeanı 3 kere çoklayarak matrix haline getirir.
//(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5)^T