向量化对称矩阵
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--;
}
实际上,我希望编译器已经完全矢量化了您的嵌套循环,因此速度应该大致相同。
我想用下面的签名写一个函数
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--;
}
实际上,我希望编译器已经完全矢量化了您的嵌套循环,因此速度应该大致相同。