首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab CSC到CSR格式的转换

Matlab CSC到CSR格式的转换
EN

Stack Overflow用户
提问于 2012-07-07 06:39:53
回答 3查看 4.5K关注 0票数 2

我正在使用mex bridge对Matlab中的稀疏矩阵执行一些操作。为此,我需要将输入矩阵转换为CSR (压缩行存储)格式,因为Matlab将稀疏矩阵存储在CSC (压缩列存储)中。

我能够得到值数组和column_indices数组。然而,我正在努力获得CSR format.Is的row_pointer数组,有没有C库可以帮助从CSC到CSR的转换?

此外,在编写CUDA内核时,使用CSR格式进行稀疏操作是否有效,或者我应该只使用以下数组:-行索引,列索引和值?

哪个on可以让我更好地控制数据,最大限度地减少自定义内核中for循环的数量?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-13 12:19:30

我最终使用CUSP库将CSC格式从Matlab转换为CSR,如下所示。

在从matlab获得矩阵A之后,我得到了它的rowcolvalues向量,并将它们复制到为每个向量创建的相应thrust::host_vector中。

之后,我创建了两个IndicesValues类型的cusp::array1d,如下所示。

代码语言:javascript
复制
    typedef typename cusp::array1d<int,cusp::host_memory>Indices;   
    typedef typename cusp::array1d<float,cusp::host_memory>Values;
    Indices row_indices(rows.begin(),rows.end());
    Indices col_indices(cols.begin(),cols.end());
    Values  Vals(Val.begin(),Val.end());

其中rowscolsVal是我从Matlab得到的thrust::host_vector

之后,我创建了一个cusp::coo_matrix_view,如下所示。

代码语言:javascript
复制
typedef cusp::coo_matrix_view<Indices,Indices,Values>HostView;
HostView Ah(m,n,NNZa,row_indices,col_indices,Vals);

其中mnNNZa是我从稀疏矩阵的mex函数中获得的参数。

我将这个视图矩阵复制到设备内存中的cusp::csr_matrix中,并设置了适当的尺寸,如下所示。

代码语言:javascript
复制
    cusp::csr_matrix<int,float,cusp::device_memory>CSR(m,n,NNZa);
    CSR = Ah;   

之后,我使用thrust::raw_pointer_cast将这个CSR矩阵的三个单独的内容数组复制回主机,其中具有适当维数的数组已经被mxCalloc,如下所示。

代码语言:javascript
复制
 cudaMemcpy(Acol,thrust::raw_pointer_cast(&CSR.column_indices[0]),sizeof(int)*(NNZa),cudaMemcpyDeviceToHost);
 cudaMemcpy(Aptr,thrust::raw_pointer_cast(&CSR.row_offsets[0]),sizeof(int)*(n+1),cudaMemcpyDeviceToHost);
 cudaMemcpy(Aval,thrust::raw_pointer_cast(&CSR.values[0]),sizeof(float)*(NNZa),cudaMemcpyDeviceToHost);

我希望这篇文章对任何在Matlab中使用CUSP的人都有用

票数 1
EN

Stack Overflow用户

发布于 2012-09-05 17:08:23

压缩行存储类似于压缩列存储,只是转置了而已。因此,最简单的事情就是在将矩阵传递给MEX文件之前,使用MATLAB对其进行转置。然后,使用以下函数

代码语言:javascript
复制
Ap = mxGetJc(spA);
Ai = mxGetIr(spA);
Ax = mxGetPr(spA);

获取内部指针并将其视为行存储。Ap是行指针,Ai是非零条目的列索引,Ax是非零值。注意,对于对称矩阵,您根本不需要做任何事情!CSC和CSR是相同的。

使用哪种格式在很大程度上取决于您稍后要对矩阵做什么。例如,看看稀疏矩阵向量乘法的matrix formats。这是一篇经典的论文,从那时起,研究已经转移,所以你可以更深入地研究。

票数 4
EN

Stack Overflow用户

发布于 2019-02-12 10:58:14

你可以这样做:

代码语言:javascript
复制
n = size(M,1);
nz_num = nnz(M);
[col,rowi,vals] = find(M');
row = zeros(n+1,1);
ll = 1; row(1) = 1;
for l = 2:n
    if rowi(l)~=rowi(l-1)
        ll = ll + 1;
        row(ll) = l;
    end
end
row(n+1) = nz_num+1;`

它对我很有效,希望它能帮助其他人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11370549

复制
相关文章

相似问题

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