我想用以下签名编写一个函数
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/