Eigen Kütüphanesi Array Sınıfı

Array sınıfı, lineer cebir için tasarlanmış Matrix sınıfının aksine, genel amaçlı diziler sağlar. Ayrıca, Array sınıfı, dizideki her katsayıya bir sabit eklenmesi veya katsayı bazında iki dizili çarpma gibi doğrusal bir cebirsel anlamı olmayabilen katsayı bazlı işlemleri gerçekleştirmenin kolay bir yolunu sağlar.

Dizi Tipleri

Dizi, Matrix ile aynı şablon parametrelerini alan bir sınıf şablonudur. Matrix’te olduğu gibi, ilk üç şablon parametresi zorunludur:

 

Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Son üç şablon parametresi isteğe bağlıdır. Matrix için olduğu gibi bu da burada tekrar açıklanmayacak ve sadece The Matrix sınıfına bakacağız.

Eigen, ayrıca, bazı genel durumlarda, matris typedeflerine benzer, ancak “dizi” sözcüğü hem 1 boyutlu hem de 2 boyutlu diziler için kullanıldığı için hafif farklılıklar gösterecek şekilde typedefler sağlar. ArrayNt formundaki typedef’lerin, bu sayfada açıklanan Matrix typedef’lerde olduğu gibi N ve t boyut ve skaler türe ait 1 boyutlu dizileri temsil ettiğini belirtiriz. 2 boyutlu diziler için, ArrayNNt formunun typedeflerini kullanırız. Bazı örnekler aşağıdaki tabloda gösterilmektedir:

TypeTypedef
Array<float,Dynamic,1>ArrayXf
Array<float,3,1>Array3f
Array<double,Dynamic,Dynamic>ArrayXXd

Bir Array(dizi) içindeki değerlere erişme

Parantez operatörü, matrislerle olduğu gibi bir dizinin katsayılarına yazma ve okuma erişimi sağlamak için aşırı yüklenmiştir. Ayrıca << işleci, dizeleri başlatmak (virgül başlatıcısı aracılığıyla) veya bunları basmak için kullanılabilir.

#include <Eigen>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXXf m(2,2);
coefficient m(0,0) = 1.0;
m(0,1) = 2.0; m(1,0) = 3.0;
m(1,1) = m(0,1) + m(1,0);
cout << m << endl << endl;
m << 1.0,2.0,
3.0,4.0;
cout << m << endl;
}

Ekran Çıktısı

1 2
3 5

1 2
3 4

Toplama ve Çıkarma İşlemleri

İki dizinin eklenmesi ve çıkartılması matrislerle aynıdır. İşlem, her iki dizi de aynı boyuta sahipse geçerlidir ve toplama veya çıkarma katsayı ile yapılır.

Örnek


#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXXf a(3,3);
ArrayXXf b(3,3);
a << 1,2,3,
4,5,6,
7,8,9;
b << 1,2,3,
1,2,3,
1,2,3;
cout << "a + b = " << endl << a + b << endl << endl; cout << "a - 2 = " << endl << a - 2 << endl;
}

Ekran Çıktısı

a + b =
2 4 6
5 7 9
8 10 12

a - 2 =
-1 0 1
2 3 4
5 6 7

Dizilerde Çarpma işlemi

Her şeyden önce, tabii ki bir diziyi bir skaler ile çarpabilirsiniz, bu matrisler gibi çalışır. Diziler temelde matristen farklı olduğu zaman, ikisini birden alarak çarparsınız. Matrisler, çarpımı matris ürünü olarak ve dizi ise çarpımı katsayı çarpımlı ürün olarak yorumluyor. Böylece, iki dizi aynı boyutlara sahip olsalar ve ancak çarpılabilir.

Örnek

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXXf a(2,2);
ArrayXXf b(2,2);
a << 1,2,
3,4;
b << 5,6,
7,8;
cout << "a * b = " << endl << a * b << endl;
}

Ekran Çıktısı

a * b =
5 12
21 32

Sık kullanılan bazı diğer fonksiyonlar

Array sınıfı, yukarıda açıklanan toplama, çıkarma ve çarpma operatörlerinin yanı sıra diğer katsayı işlemleri tanımlar. Örneğin, .abs () yöntemi her katsayının mutlak değerini alırken, .sqrt () katsayıların karekökünü hesaplar. Aynı boyutta iki diziye sahipseniz, katsayıları iki verilen dizilerin karşılık gelen katsayılarının minimumu olan diziyi oluşturmak için .min (.) Işlevini çağırabilirsiniz. Bu işlemler aşağıdaki örnekte gösterilmektedir.

Örnek

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
ArrayXf a = ArrayXf::Random(5);
a *= 2;
cout << "a =" << endl << a << endl;
cout << "a.abs() =" << endl << a.abs() << endl;
cout << "a.abs().sqrt() =" << endl << a.abs().sqrt() << endl;
cout << "a.min(a.abs().sqrt()) =" << endl << a.min(a.abs().sqrt())<< endl;
}

Ekran Çıktısı

a =
1.36
-0.422
1.13
1.19
1.65
a.abs() =
1.36
0.422
1.13
1.19
1.65
a.abs().sqrt() =
1.17
0.65
1.06
1.09
1.28
a.min(a.abs().sqrt()) =
1.17
-0.422
1.06
1.09
1.28

Dizi ve matris arasında dönüştürme işlemi

Matrix(Matris) işlemlerini diziler üzerinde uygulayamaz veya Dizi işlemlerini matrisler üzerinde uygulayamazsınız. Bu nedenle, matris çarpımı gibi doğrusal cebirsel işlemler yapmanız gerekiyorsa, matrisleri kullanmalısınız; Katsayılı işlemler yapmanız gerekiyorsa, dizileri kullanmalısınız. Bununla birlikte, bazen bu kadar basit değil, ancak Matrix ve Array işlemlerini kullanmanız gerekiyor. Bu durumda, bir matrisi bir diziye veya tersine çevirmeniz gerekir. Bu, nesneleri diziler veya matrisler olarak bildirme seçeneğine bakılmaksızın tüm işlemleri kullanmaya olanak tanır.

Matrix ifadeleri, onları katsayıya uygun işlemlerin kolayca uygulanabileceği şekilde, dizi ifadelerine ‘dönüştüren’ bir .array () yöntemine sahiptir. Tersine, dizi ifadelerinin bir .matrix () yöntemi vardır. Tüm Eigen ifade soyutlamalarıyla olduğu gibi, (derleyicinin optimize etmesine izin verilmiş olması koşuluyla) herhangi bir çalışma zamanı maliyeti yoktur. Hem .array () hem de .matrix () rvalues ve lvalues olarak kullanılabilir.

Matrisleri ve dizileri bir ifade ile karıştırmak, Eigen ile yasaktır. Örneğin, doğrudan bir matris ve dizi ekleyemezsiniz; Bir + operatörünün işlenenleri ya her ikisi de matris olmalıdır ya da her ikisi de dizi olmalıdır. Bununla birlikte, .array () ve .matrix () ile birinden diğerine kolayca dönüştürülebilir. Bu kuralın istisnası atama işleci: bir dizi değişkene bir matris ifadesi atamak veya bir matris değişkenine bir dizi ifadesi atamak için izin verilir.

Aşağıdaki örnek, .array () yöntemini kullanarak bir Matrix nesnesinde dizi işlemlerinin nasıl kullanılacağını gösterir. Örneğin, deyim result = m.array () * n.array () iki matrisi m ve n alır, onları her ikisine de bir dizi dönüştürür, bunları katsayı ile çarpmak için kullanır ve sonucu matris değişkeni sonucuna atar Yasaldır çünkü Eigen, matris değişkenlerine dizi ifadeleri atamaya izin verir).

Nitekim, bu kullanım durumu o kadar yaygındır ki, Eigen, katsayı çarpımını hesaplamak için matrisler için bir const .cwiseProduct (.) Yöntemi sunar. Bu da örnek programda gösterilmektedir.

Örnek Kullanım

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{ MatrixXf m(2,2);
MatrixXf n(2,2);
MatrixXf result(2,2);
m << 1,2,
3,4;
n << 5,6,
7,8;
result = m * n;
cout << "-- Matrix m*n: --" << endl << result << endl << endl;
result = m.array() * n.array(); cout << "-- Array m*n: --" << endl << result << endl << endl;
result = m.cwiseProduct(n);
cout << "-- With cwiseProduct: --" << endl << result << endl << endl;
result = m.array() + 4;
cout << "-- Array m + 4: --" << endl << result << endl << endl;
}

Ekran Çıktısı

-- Matrix m*n: --
19 22
43 50

-- Array m*n: --
5 12
21 32

-- With cwiseProduct: --
5 12
21 32

-- Array m + 4: --
5 6
7 8

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{ MatrixXf m(2,2);
MatrixXf n(2,2);
MatrixXf result(2,2);
m << 1,2,
3,4;
n << 5,6,
7,8;
result = (m.array() + 4).matrix() * m;
cout << "-- Combination 1: --" << endl << result << endl << endl;
result = (m.array() * n.array()).matrix() * m;
cout << "-- Combination 2: --" << endl << result << endl << endl;
}

Ekran Çıktısı

-- Combination 1: --
23 34
31 46

-- Combination 2: --
41 58
117 170