我已经用C语言以这种形式重新表示了我的稀疏矩阵:
typedef struct node
{
int column;
int value;
int row;
struct node *next;
} element;
我有一个Insert函数,它在矩阵中添加了一个元素,下面是声明:
void Insert(element *x[], int row, int column, int value)
我的问题是:如何实现计算两个稀疏矩阵乘积的函数?
这是我的试用版:
void dotProduct( element * ptrA , element * ptrB ) {
element* initB = ptrB;
int sum = 0;
while( ptrA!=NULL ) {
ptrB = initB;
int column, int row;
while( ptrB!=NULL ) {
if( ptrA->row == ptrB->column ) {
column = ptrb->column;
sum = sum + ptra->value*ptrB->value;
row = ptrA->row;
}
ptrB = ptr->next;
}
ptrA = ptrA->next;
}
insert( row, column, sum )
}
您有一个良好的开端。但是sum
变量是计算结果矩阵中所有元素的和。这不是你想要的。
这是我要改变的。
1) 代替标量整数CCD_ 2,使用稀疏矩阵CCD_。您希望将值添加到矩阵的特定元素,而不是标量和。
2) 添加一个函数,使矩阵元素(行、列)的值增加一个int值
void Add(element *x[], int row, int column, int value){
element *ptr = x;
while (ptr != NULL) {
if (ptr->row == row && ptr->column == column) {
ptr->value += value;
return;
}
}
/* We could not find an existing element with given row and column
Create a new one */
Insert(x, row, column, value)
}
3) 用Add(result, row, column, ptra->value*ptrB->value);
替换sum = sum + ptra->value*ptrB->value;
4) 你可以去掉你最后的insert( row, column, sum )
。它不会编译,因为它只有3个参数。当外部while
循环完成时,无论如何,稀疏矩阵result
中都会有一个计算出的乘积。