我想寫一個函數具有以下簽名矢量化一個對稱矩陣
VectorXd vectorize (const MatrixXd&);
它返回一個對稱矩陣的內容在VectorXd
形式,沒有重複的元素。例如,
int n = 3; // n may be much larger in practice.
MatrixXd sym(n, n);
sym << 9, 2, 3,
2, 8, 4,
3, 4, 7;
std::cout << vectorize(sym) << std::endl;
應該返回:
9
2
3
8
4
7
內vec
元素的順序並不重要,只要它是系統性的。對我而言,重要的是返回sym
的數據而沒有重複的元素,因爲sym
總是假定爲對稱的。也就是說,我想以VectorXd
的形式返回sym
的上部或下部三角形「視圖」元素。
我天真地執行了vectorize
嵌套的for
循環,但是這個函數可能會在我的程序中經常被調用(超過100萬次)。因此,我的問題是:什麼是編寫vectorize
的計算最有效的方法?我曾希望能使用Eigen的triangularView
,但我看不出如何。
預先感謝您。
看起來你需要使用'TriangularView'和'Map'。 – TriskalJM
此功能請求相關聯:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=42(請參閱特別是備註2的包裝方式 - 您還必須或多或少地執行此操作手動,雖然)。 – chtz