【发布时间】: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 这样常见的格式?
标签: c pointers data-structures matrix sparse-matrix