C++对矢量中的一个矢量进行矢量化

C++ vectorizing a vector of vectors

本文关键字:一个 矢量化 C++      更新时间:2023-10-16

我有一些代码使用vector<vector<>>来存储计算结果。

通过基准测试,我发现这阻止了我的代码向量化,即使我使用适当的C三叉戟访问元素。

我正在尝试提出一种数据结构,它将向量化并提高代码的性能。

我在这里读了几篇文章,其中几篇提到创建一个类,该类内部有两个独立的向量:1个用于连续存储数据,另一个用于存储索引,该索引标记原始2D vector<vector>的新列/行的开始。从本质上讲,它将把2D数组分解为1D,并使用"辅助"向量来进行适当的索引。

我担心的是,我还读到矢量化通常不会在这样的间接索引中发生,比如在稀疏矩阵的常见压缩行存储方案中。

在我完成所有的实施工作之前,有人以前遇到过这个问题并解决了它吗?还有其他可以帮助的建议或资源吗?

我写了一个基于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%清楚的,如果你的行有不同的大小,那么访问模式就有点复杂了。

附言:我不想再改变答案了,但我再也不会用std::vector来构造矩阵了。向量提供了矩阵所不需要的灵活性,矩阵通常在每行中有相同且固定数量的条目。