Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量化对称矩阵_C++_Eigen_Eigen3 - Fatal编程技术网

C++ 向量化对称矩阵

C++ 向量化对称矩阵,c++,eigen,eigen3,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(s

我想写一个具有以下签名的函数

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;
vec中元素的顺序并不重要,只要它是系统的。对于我来说,重要的是返回sym的数据,而不返回重复的元素,因为sym总是假定为对称的。也就是说,我想返回向量xd形式的sym的上三角视图或下三角视图的元素

我很天真地用嵌套for循环实现了矢量化,但是这个函数在我的程序中可能会被调用100多万次。因此,我的问题是:编写矢量化的计算效率最高的方法是什么?我希望使用伊根的三角形视图,但我不知道如何使用


提前感谢您。

关于效率,您可以编写一个带有列式和矢量化副本的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--;
}

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

看起来您需要使用TriangularView和Map。此功能请求是相关的:请特别参阅comment2以了解另一种打包方式-您还必须或多或少地手动执行此操作,不过,谢谢你的回答。我编辑了一个小错误:size-应该在offset+=size之后。您能解释一下为什么使用Index而不是int吗?我以前没有见过使用的Index类。@tmnol Eigen::Index默认情况下只是std::ptrdiff_t的一个typedef,它是64位平台上的一个64位整数。
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--;
}