Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ 内存效率-循环中的特征::VectorXd_C++_Algorithm_Performance_Eigen_Memory Efficient - Fatal编程技术网

C++ 内存效率-循环中的特征::VectorXd

C++ 内存效率-循环中的特征::VectorXd,c++,algorithm,performance,eigen,memory-efficient,C++,Algorithm,Performance,Eigen,Memory Efficient,我有一个测量对象,它有两个特征::VectorXd成员-一个用于位置,另一个用于速度 测量通过扫描排列在数据集中-即,在每个时间步,向数据集中添加新的测量扫描。这些类型被定义为: typedef std::共享的测量tptr; typedef std::向量扫描; typedef std::向量数据集\u t; 在算法的每次迭代开始时,我需要对每个度量应用新的转换。目前,我有: 对于自动扫描=数据集\开始;扫描!=数据集结束++扫描 自动测量=扫描->开始;米!=扫描->结束++梅斯{ //将此

我有一个测量对象,它有两个特征::VectorXd成员-一个用于位置,另一个用于速度

测量通过扫描排列在数据集中-即,在每个时间步,向数据集中添加新的测量扫描。这些类型被定义为:

typedef std::共享的测量tptr; typedef std::向量扫描; typedef std::向量数据集\u t; 在算法的每次迭代开始时,我需要对每个度量应用新的转换。目前,我有:

对于自动扫描=数据集\开始;扫描!=数据集结束++扫描 自动测量=扫描->开始;米!=扫描->结束++梅斯{ //将此测量值转换为相同的值 //坐标帧作为当前扫描 如果扫描!=std::prevdataset_u2;uu2.end{ 核心::utils::透视图\u变换图\u,*meas->pos; 核心::utils::透视图/变换图,*meas->vel; } } 其中,透视_变换定义为

void perspective\u transformconst特征::投影2D&T,特征::矢量XD&pos{ pos=T*pos.均质.h标准化; } 当我在数据集中运行扫描算法时,添加这段代码会将计算时间增加40倍,每次扫描50个测量值,这使得计算速度相当慢。我相信这是因为我有550个小对象,每个对象有2个本征内存写入。我删除了将结果写入内存的操作,而我的基准测试只显示了轻微的减少——这表明这是内存效率问题,而不是计算瓶颈


如何加快计算速度?是否有一种方法可以首先循环并从Eigen::Map中创建一个Eigen::Matrix,然后我可以进行一次计算,并让它自动更新所有测量对象的两个成员?

您可能需要修改数据结构。 目前,您有一个struct ao数组,其中包含许多间接寻址。 SOA阵列结构通常在内存访问方面更有效

那怎么办

struct Scant_t
{
     Eigen::MatrixXd position;
     Eigen::MatrixXd velocity;
}

.rowwise和.colwise运算符可能足够强大,可以执行齐次变换,这将节省编写内部循环的时间。

使用固定大小的向量而不是动态大小的向量。如果您希望共享齐次和hnormalized的代码,要真正找出根本原因,@codekaizer同质化和hnormalized都是特征值有理由使用共享指针向量来表示扫描吗?对象的共享指针只有32字节大,听起来很可疑。如果scan_t是一个简单的std::vector>或等效项,则可以使用Map和colwise使用单个特征表达式编写内部循环。如果度量包含其他成员,则可以使用两个表达式;扫描!=std::prevdataset_u2;u.end++扫描分支预测可能由于某种原因而失败,这可能会使任何循环运行得非常慢。另外,您是否使用-O3-DNDEBUG进行编译?Eigen有很多断言和范围检查,这使得您的代码比它慢。