首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >压缩稀疏行转置

压缩稀疏行转置
EN

Stack Overflow用户
提问于 2018-03-20 23:53:37
回答 1查看 3.2K关注 0票数 2

如您所知,我们可以在压缩行存储(CRS)中编写稀疏矩阵(或者,压缩稀疏行(CSR))。设A是一个m矩阵。A的转置是n×m矩阵A‘,使得对于所有0 <= i

我需要编写在CRS表示中转换矩阵的算法。我如何处理这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-04 17:32:20

我在找类似的东西。这是我的算法。我不知道它是不是最快的,但我认为它很好。

编辑:本质上相同的算法是在C++模块中为枕骨实现的。

假设矩阵由以下结构表示:

代码语言:javascript
复制
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
};

这个职能是这样做的:

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49395986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档