特征:矩阵行的计算规范比在向量上迭代计算它们慢
Eigen: Computing norms of matrix rowwise, is slower than computing them iteratively on vectors
我正在尝试使用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:将向量存储为同一矩阵的行并使用Rowwise Norm
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
来自https://eigen.tuxfamily.org/dox/group__topicstorageorders.html
如果未指定存储订单,则eigen默认将其存储在列中。如果使用便利性Typedef(Matrix3f,arrayxxd等(之一。
我最好的猜测是内存访问问题:rowwise()
可能在内存中进行了一堆"跳过",即不读取连续区域 - 而单独存储每行不会遇到此问题。
警告:当我以最好的意图写下答案时,我无法自己测试,显然它会进一步放慢速度。感谢您测试这个想法。
相关文章:
- 如何计算向量[5][1] N次
- 如何使用count_if计算向量中的可变数字范围
- 如何以C++为单位计算向量中的字节数?
- 计算向量中大于数字的元素
- 如何在 CPU 上计算向量变换?
- 计算向量的std ::映射为键的值,并将双倍作为值
- 使用异步/期货并行和并发计算向量的范数
- 使用模板计算向量的平均值
- 计算向量::empty()正在使程序崩溃
- 如何在不使用loop或std :: comguate()的情况下计算向量的总和
- 计算向量<向量中重复元素的出现次数<Object>>
- 使用Boost MPL来计算向量的长度
- 计算向量中值的最小差值的此函数的算法复杂度是多少
- 计算向量中偶数长度的单词
- 计算向量中单词的出现次数
- VecCL:计算向量中最小值以上的值的数量
- 在for循环中,每次迭代计算向量的大小是否很昂贵
- 我正在制作一个简单的程序来计算向量结果,但我无法弄清楚为什么它不起作用。
- 如何有效地计算向量的余切
- 使用rtree(或任何其他算法)计算向量中组的频率