2013-05-01 3 views
-2

Я пытался выполнять вычисления базовой матрицы в C, но умножение двух матриц вместе всегда возвращает значение 0. После прочтения других, у кого были подобные проблемы, я до сих пор не понимаю, почему это происходит. Вот функция умножения:Матрица Умножение в C всегда возвращается 0?

double** MatrixMultiplication(double** matrixA, double** matrixB, 
           int sizeXA, int sizeYA, int sizeXB, int sizeYB) 
{ 
    double** matrixC = MatrixAllocate(sizeXA, sizeYB); 
    for (int i = 0; i < sizeXA; i++) { 
     for (int j = 0; j < sizeYB; j++) { 
      for (int k = 0; k < sizeXA; k++) { 
       matrixC[i][j] += matrixA[i][k] * matrixB[k][j]; 
      } 
     } 
    } 
    return matrixC; 
} 

И это код функции MatrixAllocate:

double** MatrixAllocate(int sizeX, int sizeY) { 
    double **matrix; 
    matrix = (double**)malloc(sizeX*sizeof(double*)); 
    for (int i = 0; i < sizeX; i++) 
     matrix[i] = (double*)malloc(sizeY*sizeof(double)); 

    for (int i = 0; i < sizeX; i++) { 
     for (int j = 0; j < sizeY; j++) { 
      matrix[i][j] = 0; 
     } 
    } 
    return matrix; 
} 

Обе матрицы А и MatrixB заполнены пользователем, и при печати они имеют данные ненулевую.

+0

Возвращаемое значение 0 означает, что эта матрица имеет все элементы 0 или вывод matrixC от MatrixMultiplication - NULL? –

+1

У вас есть ошибка здесь: 'for (int k = 0; k

+0

Вам не нужно указывать возвращаемое значение 'malloc' в программе на C. –

ответ

1

Что-то еще ваша проблема, потому что это работает для меня отлично. Заметьте, я немного изменил свои версии своих методов. (. Изменились имена методов, так как только класс начинаются с Столицы, добавлена ​​возможность контролировать начальные значения в создании матрицы, чтобы не быть все 0 семян для тестирования)

Выходной сигнал, как и ожидалось был:

Foo
Ряд [0]: 0 1 2
Ряд [1]: 3 4 5
Ряд [2]: 6 7 8
Бар
Строка [0]: 0 1 2
Ряд [1]: 3 4 5
Ряд [2]: 6 7 8
Res
Ряд [0]: 15 19 23
Ряд [1]: 45 58 71
Ряд [2]: 75 97 119

Источник является :

#include <iostream> 
#include <malloc.h> 
#include <stdio.h> 

/* Replace this method with a printf version for C compatibility*/ 
void print(double **mat, int x, int y) 
{ 
    int r, c; 
    for (r = 0; r < x; r++) { 
    std::cout << "Row [" << r << "]: "; 
    for (c = 0; c < y; c++) { 
     std::cout << mat[r][c] << " "; 
    } 
    std::cout << std::endl; 
    } 
} 

void del(double **mat, int x) 
{ 
    int r = 0; 
    for (r = 0; r < x; r++) { 
     free(mat[r]); 
    } 
    free(mat); 
} 

double** createMatrix(int sizeX, int sizeY, int val=0) 
{ 

    double **matrix; 
    matrix = (double **)malloc(sizeX * sizeof(double *)); 
    int i = 0; 
    for (i = 0; i < sizeX; i++) { 
    matrix[i] = (double *)malloc(sizeY * sizeof(double)); 
    int j = 0; 
    for (j = 0; j < sizeY; j++) { 
     if (val == 0) { 
     matrix[i][j] = 0; 
     } 
     else { 
     matrix[i][j] = i * sizeY + j; 
     } 
    } 
    } 
    return matrix; 
} 

double **multiply(double **a, double **b, int xa, int ya, int xb, int yb) 
{ 
    if (ya != xb) { 
    printf("Can't multiply incompatible matrices\n"); 
    return NULL; 
    } 

    double **c = createMatrix(xa, yb, 1); 
    int i,j,k; 
    for (i = 0; i < xa; i++) { 
    for (j = 0; j < yb; j++) { 
     for (k = 0; k < xb; k++) { 
     c[i][j] += a[i][k] * b[k][j]; 
     } 
    } 
    } 
    return c; 
} 

int main(int argc, char *argv[]) 
{ 
    double **foo = createMatrix(3, 3); 
    double **bar = createMatrix(3, 3); 
    double **res = NULL; 

    printf("Foo: \n"); 
    print(foo, 3, 3); 
    printf("Bar: \n"); 
    print(bar, 3, 3); 

    res = multiply(foo, bar, 3, 3, 3, 3); 
    printf("Res: \n"); 

    if (res) { 
    print(res, 3, 3); 
    del(res, 3); 
    } 
    else { 
    printf("Couldn't multiply see earlier error message!\n"); 
    } 

    del(foo, 3); 
    del(bar, 3); 

    return 0; 
} 
+0

+1 для полной программы. Не могли бы вы написать свое решение в использовании языка OP вместо этого? – pmg

+0

Я ценю настроение и понимаю (именно поэтому я воздержался от использования истинного C++-функции). Единственное, что я сделал, это метод печати, который не имеет решающего значения для вопроса. В то время как C99 представила поддержку для bool, я обновлю эту часть. Если кто-то хочет изменить мой метод печати, чтобы использовать printf, который кошерно со мной.Я просто не использовал printf в возрасте. Я сделаю все остальное готовым. – UpAndAdam

1

проверка длина строки матрицы а и длины столбца матрицы B равны перед умножением матрицы а и В.

+0

Спасибо sepideh подумал об этом, но забыл об этом изначально, и ваше сообщение напомнило мне включить его в мой код. – UpAndAdam

+0

+1 Я собирался это сказать! Добро пожаловать в SO! –

0

это может быть удобно иметь свой MatrixAllocate возвращает единичную матрицу вместо нулевой матрицы. Для этого измените полезную нагрузку на петлю до

  matrix[i][j] = i==j? 1: 0;