我有一个COO
格式的矩阵。更具体地说,有三个矩阵row_index
,column_index
,value
。您是否可以帮助我使用C语言以高效而非计算成本的方式在CSR
format中转换此矩阵格式?是否有用于此目的的图书馆?
示例:
首席运营官格式:
row_index col_index value
1 1 1
1 2 -1
1 3 -3
2 1 -2
2 2 5
3 3 4
3 4 6
3 5 4
4 1 -4
4 3 2
4 4 7
5 2 8
5 5 -5
答案 0 :(得分:1)
Intel MKL documentation(对于mkl_csrcoo
)声明:
将CSR格式的稀疏矩阵转换为坐标格式 和 反之亦然 。
根据以上链接,您应该设置job
:
if job(1)=1, the matrix in the coordinate format is converted to the CSR format.
答案 1 :(得分:1)
我知道这是一个旧线程,但是假设COO数据是(i,j)有序/已排序,如您所示,从COO转换为CSR的顺序算法是:< / p>
int main()
{
// Example from Wikipedia (https://en.wikipedia.org/wiki/Sparse_matrix)
// Matrix:
// 10 20 0 0 0 0
// 0 30 0 40 0 0
// 0 0 50 60 70 0
// 0 0 0 0 0 80
// Expected output:
// csr_val: 10 20 30 40 50 60 70 80
// csr_col: 0 1 1 3 2 3 4 5
// csr_row: 0 2 4 7 8
const int nnz = 8; // number of non-zero elements
const int rows = 4; // number of matrix rows
const int cols = 6; // number of matrix columns
// coo data:
double coo_val[nnz] = { 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0 };
int coo_row[nnz] = { 0, 0, 1, 1, 2, 2, 2, 3 };
int coo_col[nnz] = { 0, 1, 1, 3, 2, 3, 4, 5 };
// coo to csr:
double csr_val[nnz] = { 0 };
int csr_col[nnz] = { 0 };
int csr_row[rows + 1] = { 0 };
for (int i = 0; i < nnz; i++)
{
csr_val[i] = coo_val[i];
csr_col[i] = coo_col[i];
csr_row[coo_row[i] + 1]++;
}
for (int i = 0; i < rows; i++)
{
csr_row[i + 1] += csr_row[i];
}
}
请注意,假设COO数据是按(i,j)排序/排序的,csr_col = coo_col
和csr_val = coo_val
,因此您只需要获取csr_row
,这很简单:
int csr_row[rows + 1] = { 0 };
for (int i = 0; i < nnz; i++)
csr_row[coo_row[i] + 1]++;
for (int i = 0; i < rows; i++)
csr_row[i + 1] += csr_row[i];
因此,总而言之,您可以使用上面介绍的5行代码轻松实现所需的功能。
最终备注:
建议的方法不考虑重复的COO条目。
答案 2 :(得分:0)
此转换的实现包含在scipy
(开源:BSD许可)中,特别是function coo_tocsr
。它是在C ++中,但这只是为了模拟数据和索引类型,并且为了初始化数据结构,所以它可以很容易地转换成C代码。