我有一些代码使用vector<vector<>>
来存储计算结果。
通过基准测试,我发现即使我使用适当的C-stride访问元素,这也会阻止我的代码进行矢量化。
我正在努力想出一个能够矢量化并提高代码性能的数据结构。
我在这里读了几篇文章,其中有几篇提到创建一个内部有2个独立向量的类:1用于连续存储数据,另一个用于存储索引,用于标记原始新列/行的开头2D vector<vector>
。基本上,它会将2D数组分解为1D,并使用“辅助”向量来进行正确的索引。
我担心的是,我还读到了这样的间接索引通常不会发生矢量化,例如稀疏矩阵的常见压缩行存储方案。
在我完成所有实现这项工作之前,有没有人遇到过这个问题并解决了它?还有其他可能有用的建议或资源吗?
答案 0 :(得分:1)
我写了一个基于std::vector
的小矩阵类:
#include <vector>
template <typename T>
class MyMatrix {
public:
typedef T value_type;
struct RowPointer {
int row_index;
MyMatrix* parent;
RowPointer(int r,MyMatrix* p) : row_index(r),parent(p) {}
T& operator[](int col_index) {
return parent->values[row_index*parent->cols+col_index];
}
};
MyMatrix() : rows(0),cols(0),size(0),values(){}
MyMatrix(int r,int c) : rows(r),cols(c),size(r*c),values(std::vector<T>(size)){}
RowPointer operator[](int row_index){return RowPointer(row_index,this);}
private:
size_t rows;
size_t cols;
size_t size;
std::vector<T> values;
};
可以像这样使用:
MyMatrix<double> mat = MyMatrix<double>(4,6);
mat[1][2] = 3;
std::cout << mat[0][0] << " " << mat[1][2] << std::endl;
它仍然缺少很多东西,但我认为这足以说明扁平化矩阵的想法。从你的问题来看,它不是100%清楚,如果你的行有不同的大小,那么访问模式会有点复杂。
PS:我不想再改变答案,但我绝不会再使用std::vector
来构建矩阵。向量提供矩阵不需要的灵活性,矩阵通常在每行中具有相同且固定数量的条目。