航達(dá)建設(shè)網(wǎng)站上海優(yōu)質(zhì)網(wǎng)站seo有哪些
文檔總目錄
本文目錄
- 什么是Array類?
- Array類型
- 訪問Array中的值
- 加法與減法
- Array乘法
- 其他按元素操作的運算
- array和matrix表達(dá)式之間的轉(zhuǎn)換
英文原文(The Array class and coefficient-wise operations)
本頁旨在提供有關(guān)如何使用Eigen的Array類的概述和說明。
什么是Array類?
與Matrix
類用于線性代數(shù)計算不同的是,Array
類提供了通用目的數(shù)組。此外,Array類提供了一種執(zhí)行按系數(shù)運算的簡單方法,這可能沒有線性代數(shù)意義,例如對每一個元素都加一個常數(shù)或按系數(shù)將兩個數(shù)組相乘。
Array類型
Array
是一個類模板,采用與Matrix
相同的模板參數(shù)。與Matrix
一樣,前三個模板參數(shù)是必需的:
Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
最后三個模板參數(shù)是可選的。由于這與Matrix
完全相同,因此不再在此解釋,僅參考Matrix 類。
Eigen還提供了一些常見的類型定義,其方式類似于Matrix
類型定義,但有一些細(xì)微差別,因為Array
一詞用于一維和二維數(shù)組。使用ArrayNt
代表一維N個大小的標(biāo)量,其中 N 和 t 是大小和標(biāo)量類型,詳見[矩陣與向量運算](# 3.1.2 矩陣與向量運算)。對于二維數(shù)組類型,使用 ArrayNNt
表示。示例如下:
類型 | 類型定義 |
---|---|
Array<float,Dynamic,1> | ArrayXf |
Array<float,3,1> | Array3f |
Array<double,Dynamic,Dynamic> | ArrayXXd |
Array<double,3,3> | Array33d |
訪問Array中的值
就像矩陣一樣,使用括號運算符可以訪問數(shù)組中的值。另外,<<
運算符可用于初始化數(shù)組(使用逗號初始化)或打印它們。
例如:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf m(2,2);// assign some values coefficient by coefficientm(0,0) = 1.0; m(0,1) = 2.0;m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0);// print values to standard outputstd::cout << m << std::endl << std::endl;// using the comma-initializer is also allowedm << 1.0,2.0,3.0,4.0;// print values to standard outputstd::cout << m << std::endl;
}
輸出如下:
1 2
3 51 2
3 4
有關(guān)逗號初始化的更多信息,請參閱高級初始化。
加法與減法
兩個數(shù)組的加減法與矩陣相同。如果兩個數(shù)組的大小相同,并且加法或減法是按系數(shù)進(jìn)行的,則該操作有效。
Array
還支持 array + scalar
的表達(dá)形式,這實現(xiàn)了對數(shù)組的每個系數(shù)都加一個常數(shù)。并且這是在Matrix
類中不能直接使用的功能。
示例如下:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf a(3,3);Eigen::ArrayXXf b(3,3);a << 1,2,3,4,5,6,7,8,9;b << 1,2,3,1,2,3,1,2,3;// Adding two arraysstd::cout << "a + b = " << std::endl << a + b << std::endl << std::endl;// Subtracting a scalar from an arraystd::cout << "a - 2 = " << std::endl << a - 2 << std::endl;
}
輸出如下:
a + b = 2 4 65 7 98 10 12a - 2 =
-1 0 12 3 45 6 7
Array乘法
當(dāng)然你可以將一個數(shù)組乘以一個標(biāo)量,這與矩陣相同。數(shù)組與矩陣不同的地方在于自身相乘,矩陣將乘法解釋為矩陣乘積,而數(shù)組將乘法解釋為系數(shù)乘積。因此,兩個數(shù)組相乘時它們必須具有相同的維度。
示例如下:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf a(2,2);Eigen::ArrayXXf b(2,2);a << 1,2,3,4;b << 5,6,7,8;std::cout << "a * b = " << std::endl << a * b << std::endl;
}
輸出如下:
a * b = 5 12
21 32
其他按元素操作的運算
除了上述的加法、減法和乘法運算符之外,Array
類還定義了其他按系數(shù)計算的運算。例如,abs()
方法對每個元素取絕對值,而sqrt()
計算每個系數(shù)的平方根。如果你有兩個相同大小的數(shù)組,你可以調(diào)用min(.)
來構(gòu)造一個數(shù)組,其元素是兩個給定數(shù)組對應(yīng)元素的最小值。這些操作在以下示例中進(jìn)行了說明:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXf a = Eigen::ArrayXf::Random(5);a *= 2;std::cout << "a =" << std::endl<< a << std::endl;std::cout << "a.abs() =" << std::endl<< a.abs() << std::endl;std::cout << "a.abs().sqrt() =" << std::endl<< a.abs().sqrt() << std::endl;std::cout << "a.min(a.abs().sqrt()) =" << std::endl<< a.min(a.abs().sqrt()) << std::endl;
}
輸出如下:
a =1.36
-0.4221.131.191.65
a.abs() =1.36
0.4221.131.191.65
a.abs().sqrt() =
1.17
0.65
1.06
1.09
1.28
a.min(a.abs().sqrt()) =1.17
-0.4221.061.091.28
array和matrix表達(dá)式之間的轉(zhuǎn)換
什么時候應(yīng)該使用Matrix
類的對象,什么時候應(yīng)該使用 Array
類的對象呢?
首先, Matrix
類和Array
類的方法不通用。如果需要進(jìn)行線性代數(shù)運算,例如矩陣乘法,那么應(yīng)該使用 Matrix
類;如果需要做元素運算,那么應(yīng)該使用Array
類。然而,有時并沒有那么簡單,而是需要同時使用Matrix
類和Array
類。這種情況下,需要將Matrix
轉(zhuǎn)換為Array
或相反。這樣就可以使用所有操作,而不管對象聲明為Matrix
還是Array
。
Matrix
類有一個 .array() 方法可以將Matrix
轉(zhuǎn)換為Array
。同樣,Array
有一個 .matrix() 方法。由于Eigen表達(dá)式的抽象,這些轉(zhuǎn)換發(fā)生在編譯的時候,所以不需要任何運行時間成本。.array()
和.matrix()
既可以作為左值,也可以作為右值。
Eigen 禁止在表達(dá)式中混合使用Matrix
和Array
。例如,不能將Matrix
和Array
直接相加;運算符的操作對象要么都是Matrix
,要么都是Array
,但轉(zhuǎn)換后是可以的。此規(guī)則的例外是賦值運算符,允許將Matrix
賦值給Array
,或?qū)?Array
賦值給Matrix
。
以下示例展示了如何通過使用.array()
方法對 Matrix
對象使用Array
的方法。例如,語句 result = m.array() * n.array()
將兩個矩陣m
和n
都轉(zhuǎn)換為數(shù)組,并使它們按系數(shù)相乘,再將結(jié)果分配給矩陣變量(這是合法的,因為Eigen允許將數(shù)組表達(dá)式賦值給矩陣變量)。
事實上,這種用例非常普遍,以至于Eigen為矩陣提供了一個 const .cwiseProduct(.) 方法來滿足按元素相乘的需求。
示例如下:
#include <Eigen/Dense>
#include <iostream>using Eigen::MatrixXf;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;std::cout << "-- Matrix m*n: --\n" << result << "\n\n";result = m.array() * n.array();std::cout << "-- Array m*n: --\n" << result << "\n\n";result = m.cwiseProduct(n);std::cout << "-- With cwiseProduct: --\n" << result << "\n\n";result = m.array() + 4;std::cout << "-- Array m + 4: --\n" << result << "\n\n";
}
輸出如下:
-- 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
同樣,如果array1
和array2
是數(shù)組,則表達(dá)式array1.matrix() * array2.matrix()
可以計算他們的矩陣乘積。
接下來是一個更復(fù)雜一點的示例,表達(dá)式(m.array() + 4).matrix() * m
對每一個元素都加4
,然后計算表達(dá)式結(jié)果與矩陣m
的矩陣乘積。類似的,表達(dá)式(m.array() * n.array()).matrix() * m
按元素計算矩陣m
和n
的乘積,然后計算其結(jié)果與m
的矩陣乘法。
示例如下:
#include <Eigen/Dense>
#include <iostream>using Eigen::MatrixXf;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;std::cout << "-- Combination 1: --\n" << result << "\n\n";result = (m.array() * n.array()).matrix() * m;std::cout << "-- Combination 2: --\n" << result << "\n\n";
}
輸出如下:
-- Combination 1: --
23 34
31 46-- Combination 2: --41 58
117 170