我想用以下签名编写一个函数
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
,但我不知道如何。
提前谢谢。
答案 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--;
}
实际上,我希望编译器已经完全向量化了你的嵌套循环,因此速度应该大致相同。