Matrix 压缩稀疏行转置

Matrix 压缩稀疏行转置,matrix,compression,row,sparse-matrix,transpose,Matrix,Compression,Row,Sparse Matrix,Transpose,正如您所知,我们可以在压缩行存储(CRS)(或者压缩稀疏行(CSR))中写入稀疏矩阵。 设A为mn矩阵。A的转置是一个nxm矩阵A’,因此对于所有的0我都在寻找类似的东西。这是我的算法。我不知道它是不是最快的,但我认为它相当好 假设矩阵由该结构表示: struct CRSMatrix { int n; // number of rows int m; // number of columns int nz; // number of non-zero elements

正如您所知,我们可以在压缩行存储(CRS)(或者压缩稀疏行(CSR))中写入稀疏矩阵。
设A为mn矩阵。A的转置是一个nxm矩阵A’,因此对于所有的0我都在寻找类似的东西。这是我的算法。我不知道它是不是最快的,但我认为它相当好

假设矩阵由该结构表示:

struct CRSMatrix
{
    int n; // number of rows
    int m; // number of columns
    int nz; // number of non-zero elements
    std::vector<double> val; // non-zero elements
    std::vector<int> colIndex; // column indices
    std::vector<int> rowPtr; // row ptr
};
struct-crs矩阵
{
int n;//行数
int m;//列数
int nz;//非零元素的数量
std::vector val;//非零元素
std::vector colIndex;//列索引
std::vector rowPtr;//row ptr
};
此函数用于:

CRSMatrix sparse_transpose(const CRSMatrix& input) {
    CRSMatrix res{
        input.m,
        input.n,
        input.nz,
        std::vector<double>(input.nz, 0.0),
        std::vector<int>(input.nz, 0),
        std::vector<int>(input.m + 2, 0) // one extra
    };

    // count per column
    for (int i = 0; i < input.nz; ++i) {
        ++res.rowPtr[input.colIndex[i] + 2];
    }

    // from count per column generate new rowPtr (but shifted)
    for (int i = 2; i < res.rowPtr.size(); ++i) {
        // create incremental sum
        res.rowPtr[i] += res.rowPtr[i - 1];
    }

    // perform the main part
    for (int i = 0; i < input.n; ++i) {
        for (int j = input.rowPtr[i]; j < input.rowPtr[i + 1]; ++j) {
            // calculate index to transposed matrix at which we should place current element, and at the same time build final rowPtr
            const int new_index = res.rowPtr[input.colIndex[j] + 1]++;
            res.val[new_index] = input.val[j];
            res.colIndex[new_index] = i;
        }
    }
    res.rowPtr.pop_back(); // pop that one extra

    return res;
}
CRSMatrix稀疏转置(const-CRSMatrix&input){
CRS矩阵资源{
输入.m,
输入,
input.nz,
标准::向量(input.nz,0.0),
标准::向量(input.nz,0),
std::vector(input.m+2,0)//额外一个
};
//每列计数
对于(int i=0;i
对于试图理解
res.rowPtr
是什么的人来说:您需要一个数据结构来回答一个简单的查询“在这个元素之前放置了多少个元素?”,所以如果您仔细观察
res.rowPtr
您会发现对于
colIndex[i]
(转置的行索引)来说,答案被放置在
colIndex[i]+1
中。和
res.rowPtr.pop_back()可以出现在主循环之前。问:我注意到上面的答案在转置后并没有更新m和n维度。当然,这些应该是不同的?@dbc我没问你问题?你是什么意思?你是指这个问题,还是你犯了错误,实际上想链接到另一个问题?我也不知道你为什么指的是SysEng?就这个答案而言,我可以说我在转置的一开始就交换了m和n维。@Marko-我所指的帖子得到的答案在评论中被删除了。我认为这是一个有效的评论,所以我在这里复制了它,作为一个评论,带有属性。