矢量化对称矩阵

Vectorize a Symmetric Matrix

本文关键字:对称 矢量化      更新时间:2023-10-16

我想写一个具有以下签名的函数

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的上三角形或下三角形"视图"的元素。

我已经天真地实现了带有嵌套for循环的vectorize,但这个函数可能在我的程序中经常被调用(超过 100 万次(。因此,我的问题是:编写vectorize的计算效率最高的方法是什么?我希望使用艾根的triangularView,但我看不出如何。

提前谢谢你。

关于效率,你可以用逐列(因此矢量化(的副本编写一个 for 循环:

VectorXd res(mat.rows()*(mat.cols()+1)/2);
Index size = mat.rows();
Index offset = 0;
for(Index j=0; j<mat.cols(); ++j) {
    res.segment(offset,size) = mat.col(j).tail(size);
    offset += size;
    size--;
}

在实践中,我希望编译器已经完全矢量化了嵌套循环,因此速度应该大致相同。