矢量化对称矩阵
Vectorize a Symmetric Matrix
我想写一个具有以下签名的函数
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
总是被认为是对称的。也就是说,我想以VectorXd
形式返回sym
的上三角形或下三角形"视图"的元素。
我已经天真地实现了带有嵌套for
循环的vectorize
,但这个函数可能在我的程序中经常被调用(超过 100 万次(。因此,我的问题是:编写vectorize
的计算效率最高的方法是什么?我希望使用艾根的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--;
}
在实践中,我希望编译器已经完全矢量化了嵌套循环,因此速度应该大致相同。
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 阵列火矢量化
- 使用矢量化c++的矩阵乘法
- 循环中标量乘积的自动矢量化
- 如何在clang++中禁用矢量化
- 加权外积的矢量化
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 包含比较的循环的自动矢量化
- pcl_ros::transformPointCloud的矢量化
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- (如何)我可以使用openmp矢量化"std::complex<double>"吗?
- C 矩阵乘法自动矢量化
- 矢量化 :乘以_m256i元素
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 为什么内联函数中的循环无法正确自动矢量化
- 是否保证 OpenMP 矢量化
- AVX,SSE总和比gcc自动矢量化慢
- 嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
- 模乘法的矢量化
- 处理双数组中未对齐的部分,对其余部分进行矢量化