矢量化对称矩阵

时间:2017-06-12 17:43:25

标签: c++ eigen eigen3

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

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,但是我的程序中可能经常调用此函数(超过100万次)。因此我的问题是:编写vectorize的计算效率最高的方式是什么?我希望使用Eigen的triangularView,但我不知道如何。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

关于效率,您可以使用按列(因此向量化)的副本编写单个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--;
}

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