向量化对称矩阵

Vectorize a Symmetric Matrix

我想用下面的签名写一个函数

VectorXd vectorize (const MatrixXd&);

其中 return 是 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;

应该return:

9
2
3
8
4
7

vec 中元素的顺序并不重要,只要它是系统的。对我来说重要的是 return sym 的数据没有重复元素,因为 sym 总是被假定为对称的。即我想returnsym的上三角或下三角"view"的元素以VectorXd形式。

我用嵌套的 for 循环天真地实现了 vectorize,但是这个函数在我的程序中可能被调用得非常频繁(超过 100 万次)。因此,我的问题是:编写 vectorize 的计算效率最高的方法是什么? 我希望使用 Eigen 的 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--;
}

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