gpt4 book ai didi

c++ - 特征:逐行计算矩阵范数,比在 vector 上迭代计算它们慢

转载 作者:行者123 更新时间:2023-11-30 03:25:21 26 4
gpt4 key购买 nike

我正在尝试使用 Eigen 加速 vector 范数的计算。

尝试了两种方式:

方式一:将 vector 分别存储在数组中(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:将 vector 存储为同一矩阵的行并使用行向范数

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 甚至更慢。

我做错了什么吗?有没有一种方法可以更快地计算范数?

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

更快

最佳答案

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

If the storage order is not specified, then Eigen defaults to storing the entry in column-major. This is also the case if one of the convenience typedefs (Matrix3f, ArrayXXd, etc.) is used.

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

警告:虽然我是出于好意写下我的答案,但我无法亲自测试它,显然它会进一步减慢速度。谢谢SomethingSomething用于测试这个想法。

关于c++ - 特征:逐行计算矩阵范数,比在 vector 上迭代计算它们慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49046479/

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