c中的稀疏矩阵插入

Posted

技术标签:

【中文标题】c中的稀疏矩阵插入【英文标题】:Sparse matrix insert in c 【发布时间】:2012-01-26 17:05:48 【问题描述】:

我正在尝试进行有效的稀疏矩阵乘法。现在我正在将数据读入内存,这就是我的数据结构的样子:

typedef struct node
int x;
int y;
int value;
struct node* row;
struct node* col;
node;

typedef struct matrix
int height;
int width; 
node** rowList;
node** colList;
matrix;

我当前的插入代码是:

void insert(matrix** M, int row_index, int col_index, int value)

    node* currNode=(node*)malloc(sizeof(node));
    currNode->x=row_index;
    currNode->y=col_index;
    currNode->value=value;

    if ((*M)->rowList[row_index] == NULL)  /* index is empty */
        currNode->row = NULL;
        (*M)->rowList[row_index] = currNode;
    
    else if ((*M)->rowList[row_index]->y > col_index)  /* insert node to front */
        //printf("%d, %d\n", (*M)->rowList[row_index]->y, col_index);
        currNode->col = (*M)->rowList[row_index];
        (*M)->rowList[row_index] = currNode;
    
    else if ((*M)->rowList[row_index]->y < col_index)  /* insert node to front */  
        node* rowptr = (node*)malloc(sizeof(node));
        rowptr = (*M)->rowList[row_index];
        while(rowptr->col!=NULL&&rowptr->col->y < col_index)
            rowptr=rowptr->col;

        currNode->col=rowptr->col;
        rowptr->col=currNode;
        //printf("-----------------%d\n", rowptr->y);
    

    if ((*M)->colList[col_index] == NULL)  
        currNode->col = NULL;
        (*M)->colList[col_index] = currNode;
    
    else
    if ((*M)->colList[col_index]->x > row_index)  
        //printf("%d, %d\n", (*M)->colList[col_index]->x, row_index);
        currNode->row = (*M)->colList[col_index];
        (*M)->colList[col_index] = currNode;
    

如果你问,这是我的打印功能:

void print_matrix(matrix *M)
    for(int i=0;i<M->height;i++)
        while(M->rowList[i]!=NULL)
            printf("i=%d, j=%d, v=%d\n",M->rowList[i]->x, M->rowList[i]->y,
                   M->rowList[i]->value);
            M->rowList[i]=M->rowList[i]->col;
        
    

对于这个输入:

5,5
0,0,1
0,1,2
0,3,3
0,4,4

其中 (5,5) 矩阵维度和 (0,0,1) = i,j,value,我得到这个:

i=0, j=0, v=1
i=0, j=1, v=2
i=0, j=3, v=3
i=0, j=4, v=4
i=0, j=4, v=4

对于这个输入:

5,5
0,0,1
0,1,2
0,3,3
0,4,4
0,2,5

我明白了:

i=0, j=0, v=1
i=0, j=1, v=2
i=0, j=2, v=5
i=0, j=2, v=5

我认为问题出在这里:

else if ((*M)->rowList[row_index]->y < col_index) 
    node* rowptr = (node*)malloc(sizeof(node));
    rowptr = (*M)->rowList[row_index];
    while(rowptr->col!=NULL&&rowptr->col->y < col_index)
        rowptr=rowptr->col;

        currNode->col=rowptr->col;
        rowptr->col=currNode;
    
    [ ... ]

当我添加一个更小的新元素时,我不知何故删除了其中一个值。

问题是:如何让这段代码使用正确提供的数据结构将我的稀疏矩阵值加载到内存中?

谢谢你^^

【问题讨论】:

那个数据格式是什么?看起来不像我遇到的任何东西。我自己,我会使用CSparse 数据格式是:前 2 个整数是矩阵维度,然后在文件中的每一行,我们都有非零值的坐标和值本身。如 (0,1,5) 是第 0 行,第 1 列,值 5 这是文件格式。我不认识数据结构,你的节点和矩阵。 哦..误解..我没有使用任何标准模式。我用我自己的。 为什么要使用自己的更复杂的格式,而不是像 CSC 这样常见的格式? 【参考方案1】:

这里:

if ((*M)->colList[col_index] == NULL) 
    currNode->col = NULL;
    (*M)->colList[col_index] = currNode;

你写currNode-&gt;col的地方,你应该写currNode-&gt;row。进行此更改后,第二个输入文件的输出是正确的。

在查看代码时,我注意到了其他奇怪的事情;例如, print_matrix 函数也会破坏矩阵 ->col 指针链。另外,在这两行中

    node* rowptr = (node*)malloc(sizeof(node));
    rowptr = (*M)->rowList[row_index];

您正在分配内存,然后立即覆盖指向它的指针。

【讨论】:

以上是关于c中的稀疏矩阵插入的主要内容,如果未能解决你的问题,请参考以下文章

c语言根据以下描述编写一个程序使其能完成对稀疏矩阵的压缩与还原,即给定稀疏矩阵可以压缩存储一个三元组

稀疏矩阵与密集矩阵乘法 C++ Tensorflow

多维数组-矩阵的压缩存储- 稀疏矩阵(一)

用C试一下稀疏矩阵的快速转置

如何有效地将稀疏矩阵列添加到另一个稀疏矩阵中的每一列?

使用稀疏矩阵中的 GBC 构建模型时获取具有序列错误的数组元素