【发布时间】:2016-02-20 09:23:32
【问题描述】:
在我的项目中,我定义了一个类Matrix,我使用的数据结构是std::vector<std::vector<T> > matrix;
现在我的问题是:如何更有效地访问它?如果我没记错的话,按索引访问(例如矩阵[i][j])是一种效率杀手,而建议的方式是通过迭代器。是这样吗?
假设是这样,那么我还有另一个问题:有时我需要知道我正在操作的行或列的索引。例如,考虑与另一个矩阵逐个元素相加:我怎么能这么说
C[i][j] = A[i][j] + B[i][j]
不使用两个索引i 和j?然后我还有其他操作,比如乘以 Vector(我正在定义的另一个类),但我想如果我正确理解访问元素的最有效方法,那么我可以复制相同的模式。
【问题讨论】:
-
matrix[i][j]还不错。会杀了你的是你有 N+1std::vectors with no assurances of spatial locality。如果您想要快速,请使用一维向量并使用 row * numColumns + column 对其进行索引。请注意此处如何定义矩阵类:isocpp.org/wiki/faq/operator-overloading#matrix-subscript-op。它解决了您将遇到的许多问题。不过,我建议使用std:: vector代替动态数组。 -
按索引访问本身不是问题,效率杀手是访问非连续内存,不管你怎么做或如何避免它。
-
我明白了,那么我可能会尝试使用包含
rows*columns元素的一维std::vector -
如果你手头有一个链接,我不介意,@harold。一直在寻找改进代码的方法。
-
@user4581301 这么多链接,很难选择.. 如果您搜索“矩阵乘法缓存阻塞”,您应该会找到各种有趣的文章/论文/等。基准也是。
标签: c++ performance vector