2016-01-04 4 views
-4

я уже rappresented моей разреженной матрицы в той форме, используя 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) 
} 
+0

Помогло бы узнать, были ли элементы в определенном порядке. – Veltas

+0

нет, не в определенном порядке – userfi

+1

Это плохой подход. Вы должны связывать узлы в направлениях X и Y. И форматируйте свой код лучше. Пробелы - это не только отступы. – Olaf

ответ

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.

Смежные вопросы