【发布时间】:2015-06-24 13:57:57
【问题描述】:
注意:我也在 Eigen 论坛 here 上发布了此内容
我想用 3x3 矩阵预乘 3xN 矩阵,即转换 3D 点,例如 p_dest = T * p_source
初始化矩阵后:
Eigen::Matrix<double, 3, Eigen::Dynamic> points = Eigen::Matrix<double, 3, Eigen::Dynamic>::Random(3, NUMCOLS);
Eigen::Matrix<double, 3, Eigen::Dynamic> dest = Eigen::Matrix<double, 3, Eigen::Dynamic>(3, NUMCOLS);
int NT = 100;
我已经评估了这两个版本
// eigen direct multiplication
for (int i = 0; i < NT; i++){
Eigen::Matrix3d T = Eigen::Matrix3d::Random();
dest.noalias() = T * points;
}
和
// col multiplication
for (int i = 0; i < NT; i++){
Eigen::Matrix3d T = Eigen::Matrix3d::Random();
for (int c = 0; c < points.cols(); c++){
dest.col(c) = T * points.col(c);
}
}
NT 重复只是为了计算平均时间
我很惊讶 逐列 乘法比直接乘法快 4/5 倍
(如果我不使用.noalias(),直接乘法会更慢,但这很好,因为它正在做一个临时复制)
我尝试将 NUMCOLS 从 0 更改为 1000000,并且关系是线性的。
我正在使用 Visual Studio 2013 并在发行版中编译
下图在 X 上显示矩阵的列数,在 Y 上显示单个操作的平均时间,蓝色为 col 乘 col 乘法,红色为矩阵乘法
有什么建议为什么会发生这种情况?
【问题讨论】:
标签: c++ performance matrix visual-studio-2013 eigen