我想用以下签名编写一个函数

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是对称的。也就是说,我想以sym形式返回VectorXd的上三角或下三角“视图”的元素。

我已经用嵌套的vectorize循环简单地实现了for,但是在我的程序中可能经常调用此函数(超过一百万次)。因此,我的问题是:编写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--;
}


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

关于c++ - 向量化对称矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44505645/

10-11 22:48