gpt4 book ai didi

c++ - 将 eigen::MatrixXf 映射到现有的 eigen::matrixXf

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:55 25 4
gpt4 key购买 nike

有时 ago用户 ggael 给出了答案将 eigen::vectorXf 映射到 eigen::matrixXf 的问题。

现在,我需要做一些类似的事情,但要针对现有矩阵,例如,我知道我可以:

for(int i=0;i<p;++i){
VectorXf vec=q.col(i);
/*q is a p**2 by n matrix*/
Map<MatrixXf> qi(vec.data(),p,p);
/*run function that uses qi to produce a scalare and store that scalar*/
}

但是(在我看来)这样做会更有效率在循环外一劳永逸地创建 qi 然后一遍又一遍地使用相同的qi(对吗?)

此外,我想知道中间步骤在哪里我将 q.col(i) 映射到 vec 真的很有必要...

最近的回答proposes做:

qi=Map<MatrixXd>(vec.data(),p,p);

但这样做会产生:

In function ‘Eigen::VectorXi DepType(const MatrixXf&, const MatrixXf&, const int&)’:
DeC.cpp:279:34: error: no matching function for call to ‘Eigen::Map<Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001> >::Map(Eigen::PlainObjectBase<Eigen::Matrix<float, -0x00000000000000001, 1> >::Scalar*, int&, int&)’
DeC.cpp:279:34: note: candidates are:
/eigen/Eigen/src/Core/Map.h:179:12: note: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, Eigen::Map<MatrixType, MapOptions, StrideType>::Index, Eigen::Map<MatrixType, MapOptions, StrideType>::Index, const StrideType&) [with PlainObjectType = Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, int MapOptions = 0, StrideType = Eigen::Stride<0, 0>, Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = double*, Eigen::Map<MatrixType, MapOptions, StrideType>::Index = long int]
/home/kaveh/Desktop/work/p1/geqw4/vi3/out/sp/ccode/eigen/Eigen/src/Core/Map.h:179:12: note: no known conversion for argument 1 from ‘Eigen::PlainObjectBase<Eigen::Matrix<float, -0x00000000000000001, 1> >::Scalar* {aka float*}’ to ‘double*’
/eigen/Eigen/src/Core/Map.h:166:12: note: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, Eigen::Map<MatrixType, MapOptions, StrideType>::Index, const StrideType&) [with PlainObjectType = Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, int MapOptions = 0, StrideType = Eigen::Stride<0, 0>, Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = double*, Eigen::Map<MatrixType, MapOptions, StrideType>::Index = long int]
/eigen/Eigen/src/Core/Map.h:166:12: note: no known conversion for argument 1 from ‘Eigen::PlainObjectBase<Eigen::Matrix<float, -0x00000000000000001, 1> >::Scalar* {aka float*}’ to ‘double*’
/eigen/Eigen/src/Core/Map.h:154:12: note: Eigen::Map<MatrixType, MapOptions, StrideType>::Map(Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType, const StrideType&) [with PlainObjectType = Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, int MapOptions = 0, StrideType = Eigen::Stride<0, 0>, Eigen::Map<MatrixType, MapOptions, StrideType>::PointerArgType = double*]
/eigen/Eigen/src/Core/Map.h:154:12: note: candidate expects 2 arguments, 3 provided
/eigen/Eigen/src/Core/Map.h:119:79: note: Eigen::Map<Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001> >::Map(const Eigen::Map<Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001> >&)
/eigen/Eigen/src/Core/Map.h:119:79: note: candidate expects 1 argument, 3 provided

例如似乎 Eigen 认为 qi 是一个 vector ....:(

最佳答案

以下内容:

qi=Map<MatrixXd>(vec.data(),p,p);

表示要将Map(vec.data(),p,p)的系数复制到qi引用的矩阵中。但是,您真正想要的是重新初始化 Map<> 对象。为此,您必须使用 C++ 的 construct new 语法再次调用构造函数:

new (&qi) Map<MatrixXd>(vec.data(),p,p);

此外,我必须说 Map<> 对象非常轻量级:它只是一个指针和 2 个整数静态分配在堆栈上。因此,将 Map<> qi 的声明移到循环外将对性能产生零影响。另一方面,请注意您不需要将 q.col(i) 复制到临时缓冲区中。如果q是column major,你可以直接做:

Map<MatrixXf> qi(q.col(i).data(),p,p);

关于c++ - 将 eigen::MatrixXf 映射到现有的 eigen::matrixXf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14264413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com