Примечание. Я разместил это также на форуме Eigen здесь
Я хочу предварительно умножить матрицы 3xN на матрицу 3x3, т.е. преобразовать 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 среднее время для одной операции, синим цветом показано умножение столбцов на столбцы, красным — умножение матрицы.
Любое предложение, почему это происходит?