Menü Kapat

Eigen ile Matris ve Vektör Aritmetiği

Eigen ile matrislerde ve vektörlerde çeşitli işlemler yapılabilmektedir. Bunlar basitçe *, +, – vb. işlemler olabilir. Eigen C++ operatörlerinin bir kısmını overload etmiştir.

 Toplama ve Çıkarma işlemleri

Toplanacak matris ya da vektörler aynı satır ve sütun sayısına sahip olmak zorundadır. Aynı zamanda aynı veri türünü tutmak zorundadırlar.

Aşağıdaki işlemler yapılabilmektedir:

a + b

a – b

-a

a += b

a -= b

Örnek kod:

#include <iostream>
#include <Eigen>

using namespace Eigen;
using namespace std;

int main()
{
matrix<int, 2, 2> a;
a << 1,2,
3,4;

matrix<int, 2, 2> b;
b << 2,3,
3,1;

cout << " a + b " << a + b << endl;
cout << " a - b " << a - b << endl;
cout << " -a = " << -a << endl;

return 0;
}

Matrisin Transpozu ve Konjuge Matris

Matrisin transpozu .transpose() , konjugesini .conjugate() ve adjointini .adjoint() fonksiyonları çağırılarak bulunabilir.

Gerçek sayılar için konjuge matris olmayacağı için değişiklik yapmaz ve adjoint transpoza eşittir.

Örnek kod:

MatrixXcf a = MatrixXcf::Random(2,2);
cout << "Here is the matrix a\n" << a << endl;
cout << "Here is the matrix a^T\n" << a.transpose() << endl;
cout << "Here is the conjugate of a\n" << a.conjugate() << endl;
cout << "Here is the matrix a^*\n" << a.adjoint() << endl;

Kodun çıktısı

Here is the matrix a
(-0.211,0.68) (-0.605,0.823)
(0.597,0.566) (0.536,-0.33)
Here is the matrix a^T
(-0.211,0.68) (0.597,0.566)
(-0.605,0.823) (0.536,-0.33)
Here is the conjugate of a
(-0.211,-0.68) (-0.605,-0.823)
(0.597,-0.566) (0.536,0.33)
Here is the matrix a^*
(-0.211,-0.68) (0.597,-0.566)
(-0.605,-0.823) (0.536,0.33)

Uyarı:

Bir matrisin transpuzunu alıp o matrise atama yapmak, hatalı bir sonuç almaya sebep olur.

Matrix2i a; a << 1, 2, 3, 4;
cout << "Here is the matrix a:\n" << a << endl;
a = a.transpose(); // !!! do NOT do this !!!
cout << "and the result of the aliasing effect:\n" << a << endl;
Here is the matrix a:
1 2
3 4
and the result of the aliasing effect:
1 2
2 4

Bu işlem .transposeInPlace() ile yapılmalıdır.

MatrixXf a(2,3); a << 1, 2, 3, 4, 5, 6;
cout << "Here is the initial matrix a:\n" << a << endl;
a.transposeInPlace();
cout << "and after being transposed:\n" << a << endl;

Kodun çıktısı:

Here is the initial matrix a:
1 2 3
4 5 6
and after being transposed:
1 4
2 5
3 6

Matris-Matris ve Matris-Vektör çarpımı

Kullanılabilecek operatörler

a * b
a *= b

#include <Eigen>
#include <iostream>


using namespace Eigen;
int main()
{
Matrix2d mat;
mat << 1, 2,
3, 4;
Vector2d u(-1,1), v(2,0);
std::cout << "Here is mat*mat:\n" << mat*mat << std::endl;
std::cout << "Here is mat*u:\n" << mat*u << std::endl;
std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl;
std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl;
std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl;
std::cout << "Let's multiply mat by itself" << std::endl;
mat = mat*mat;
std::cout << "Now mat is mat:\n" << mat << std::endl;
}

Kodun çıktısı

Here is mat*mat:
7 10
15 22
Here is mat*u:
1
1
Here is u^T*mat:
2 2
Here is u^T*v:
-2
Here is u*v^T:
-2 -0
2 0
Let's multiply mat by itself
Now mat is mat:
7 10
15 22

Basit aritmetik indirgeme operatörleri

.sum() Matris elemanlarının toplamını döndürür
.prod() Matris elemanlarının çarpımını döndürür
.mean() Matris elemanlarının ortalamasını döndürür
.minCoeff() Matrisin en küçük elemanını döndürür
.maxCoeff() Matrisin en büyük elemanını döndürür
.trace() Matrisin köşegen elemanlarının toplamını döndürür. mat.diagonal().sum() ile aynı sonucu döndürür.

minCoeff() ve maxCoeff() fonksiyonlarının koordinat döndüren versiyonları da vardır. Dönüş değeri için argüman alırlar.

Örnek:

Matrix3f m = Matrix3f::Random();
std::ptrdiff_t i, j;
float minOfM = m.minCoeff(&i,&j);
cout << "Here is the matrix m:\n" << m << endl;
cout << "Its minimum coefficient (" << minOfM
<< ") is at position (" << i << "," << j << ")\n\n";
RowVector4i v = RowVector4i::Random();
int maxOfV = v.maxCoeff(&i);
cout << "Here is the vector v: " << v << endl;
cout << "Its maximum coefficient (" << maxOfV
<< ") is at position " << i << endl;

Programın çıktısı

Here is the matrix m:
0.68 0.597 -0.33
-0.211 0.823 0.536
0.566 -0.605 -0.444
Its minimum coefficient (-0.605) is at position (2,1)

Here is the vector v: 1 0 3 -3
Its maximum coefficient (3) is at position 2

 İşlemlerin Geçerliliği

Eigen hataları mümkün oldukça derleme sırasında kontrol eder. Hatalar bazen korkutucu ve uzun gözükebilir. Eigen hatanın önemli kısmını büyük harflerle yazar.

örnek:

Matrix3f m;
Vector4f v;
v = m*v; // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES

 

Bir yorum yazınız. Yorumlarınız bizim için değerlidir.