链表稀疏矩阵之间的矩阵乘积

时间:2016-01-04 14:36:33

标签: c matrix linked-list sparse-matrix

我使用 C 语言对该格式的稀疏矩阵进行了表达:

typedef struct node
{
    int column;
    int value;
    int row;
    struct node *next;
} element;

我有一个在矩阵中添加元素的插入函数,这里是声明:

 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 )
}

1 个答案:

答案 0 :(得分:0)

你有个好的开始。但是您的sum变量正在计算结果矩阵的所有元素的总和。那不是你想要的。

这是我要改变的。

1)使用稀疏矩阵int sum = 0而不是标量整数elment *result = NULL。您希望将值添加到矩阵的特定元素,而不是标量和。

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)将sum = sum + ptra->value*ptrB->value;替换为Add(result, row, column, ptra->value*ptrB->value);

4)你可以摆脱最后的insert( row, column, sum )。它不会编译,因为它只有3个参数。当您的外部while循环完成时,无论如何,您都会在稀疏矩阵result中拥有计算产品。