特征:矩阵行的计算规范比在矢量上迭代计算它们要慢

问题描述 投票:1回答:1

我试图使用Eigen来加速矢量范数的计算。

尝试以两种方式做到这一点:

方法1:将向量分别存储在数组中(std :: vector)

std::vector<Eigen::Matrix<double, 1, VECTOR_SIZE>> my_vectors(num_vectors);
Eigen::Matrix<double, Eigen::Dynamic, 1> norms(num_vectors, 1);
for (int i = 0 ; i < my_vectors.size() ; i++) {
    norms(i, 0) = my_vectors[i].norm();
}

方式2:将向量存储为相同矩阵的行并使用行方向

Eigen::Matrix<double, Eigen::Dynamic, VECTOR_SIZE> my_vectors(num_vectors, VECTOR_SIZE);
Eigen::Matrix<double, Eigen::Dynamic, 1> norms = my_vectors.rowwise().norm();

我很惊讶地看到Way1很慢,Way2甚至更慢。

难道我做错了什么?有没有办法更快地计算规范?

在我做的另一个测试中,矢量减法也是如此。对单独的向量进行迭代,从每个向量中减少相同的向量,比将所有向量存储为矩阵行并使用.rowwise() - vector_to_subtract更快

c++ linear-algebra eigen
1个回答
2
投票

来自https://eigen.tuxfamily.org/dox/group__TopicStorageOrders.html

如果未指定存储顺序,则Eigen默认将条目存储在column-major中。如果使用其中一个便捷类型定义(Matrix3f,ArrayXXd等),情况也是如此。

我最好的猜测是内存访问问题:rowwise()可能在内存中做了一堆“跳过”,即没有读取连续的区域 - 而单独存储每一行​​并不会遇到这个问题。

警告:当我以最好的意图写出我的答案时,我无法自己测试,显然它会进一步降低速度。感谢SomethingSomething测试这个想法。

© www.soinside.com 2019 - 2024. All rights reserved.