我正在使用mex bridge对Matlab中的稀疏矩阵执行一些操作。为此,我需要将输入矩阵转换为CSR (压缩行存储)格式,因为Matlab将稀疏矩阵存储在CSC (压缩列存储)中。
我能够得到值数组和column_indices数组。然而,我正在努力获得CSR format.Is的row_pointer数组,有没有C库可以帮助从CSC到CSR的转换?
此外,在编写CUDA内核时,使用CSR格式进行稀疏操作是否有效,或者我应该只使用以下数组:-行索引,列索引和值?
哪个on可以让我更好地控制数据,最大限度地减少自定义内核中for循环的数量?
发布于 2012-09-13 12:19:30
我最终使用CUSP库将CSC格式从Matlab转换为CSR,如下所示。
在从matlab获得矩阵A之后,我得到了它的row、col和values向量,并将它们复制到为每个向量创建的相应thrust::host_vector中。
之后,我创建了两个Indices和Values类型的cusp::array1d,如下所示。
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());其中rows,cols和Val是我从Matlab得到的thrust::host_vector。
之后,我创建了一个cusp::coo_matrix_view,如下所示。
typedef cusp::coo_matrix_view<Indices,Indices,Values>HostView;
HostView Ah(m,n,NNZa,row_indices,col_indices,Vals);其中m、n和NNZa是我从稀疏矩阵的mex函数中获得的参数。
我将这个视图矩阵复制到设备内存中的cusp::csr_matrix中,并设置了适当的尺寸,如下所示。
cusp::csr_matrix<int,float,cusp::device_memory>CSR(m,n,NNZa);
CSR = Ah; 之后,我使用thrust::raw_pointer_cast将这个CSR矩阵的三个单独的内容数组复制回主机,其中具有适当维数的数组已经被mxCalloc,如下所示。
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的人都有用
发布于 2012-09-05 17:08:23
压缩行存储类似于压缩列存储,只是转置了而已。因此,最简单的事情就是在将矩阵传递给MEX文件之前,使用MATLAB对其进行转置。然后,使用以下函数
Ap = mxGetJc(spA);
Ai = mxGetIr(spA);
Ax = mxGetPr(spA);获取内部指针并将其视为行存储。Ap是行指针,Ai是非零条目的列索引,Ax是非零值。注意,对于对称矩阵,您根本不需要做任何事情!CSC和CSR是相同的。
使用哪种格式在很大程度上取决于您稍后要对矩阵做什么。例如,看看稀疏矩阵向量乘法的matrix formats。这是一篇经典的论文,从那时起,研究已经转移,所以你可以更深入地研究。
发布于 2019-02-12 10:58:14
你可以这样做:
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;`它对我很有效,希望它能帮助其他人!
https://stackoverflow.com/questions/11370549
复制相似问题