Умножение двух массивов в C - PullRequest
2 голосов
/ 10 декабря 2010

Я пытаюсь умножить два многомерных массива для формирования матрицы. У меня есть эта функция. Это должно работать в теории. Тем не менее, я просто получаю 0 и большие / неудобные числа. Может ли кто-нибудь помочь мне с этим?

int **matrix_mult( int **a, int **b, int nr1, int nc1, int nc2 )
{
    int **c;
    int i,j,k,l;
    c = malloc(sizeof(int *)*nr1);

    if (c == NULL){
        printf("Insuff memm");
    }

    for(l=0;l<nr1;l++){
        c[l] = malloc(sizeof(int)*nc1);
        if (c[l] == NULL){
            printf("Insuff memm");
        }

    }//for loop


    for (i=0;i<nr1;i++){
        for (j=0;j<nc2;j++){
            for (k=0;k<nc1;k++){

                c[i][j] = (a[i][k]) * (b[k][j]);
    }
    }
    }
        return( c );  
    }

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

Вы делаете умножение математических матриц? Если так, то не должно быть:

for(i = 0; i < nr1; i++)
{
    for(j = 0; j < nc1; j++)
    {
        c[i][k] = 0;

        for(k = 0; k < nc2; k++)
        {
            c[i][k] += (a[i][j]) * (b[j][k]);
        }
    }
}

Мое полное и окончательное решение, протестированное для получения разумных результатов (я на самом деле не выполнял все вычисления вручную, чтобы проверить их) и без каких-либо полезных мелочей, таких как проверка работы выделения памяти,:

int **matrix_mult(int **a, int **b, int nr1, int nc1, int nc2)
{
    int **c;
    int i, j, k;

    c = malloc(sizeof(int *) * nr1);

    for (i = 0; i < nr1; i++)
    {
        c[i] = malloc(sizeof(int) * nc2);

        for (k = 0; k < nc2; k++)
        {
            c[i][k] = 0;

            for (j = 0; j < nc1; j++)
            {
                c[i][k] += (a[i][j]) * (b[j][k]);
            }
        }
    }

    return c;
}

В моем исходном ответе было несколько опечаток в ядре цикла for, главным образом из-за того, что меня вводил в заблуждение другой ответ. Они были исправлены для потомков.

0 голосов
/ 10 декабря 2010

Если вы измените c[i][j] = (a[i][k]) * (b[k][j]); на c[i][j] += (a[i][k]) * (b[k][j]); в своем коде, то все будет работать нормально, если

  • nr1 - количество строк матрицы a
  • nc1 - количество столбцов матрицы a
  • nc2 - количество столбцов матрицы b

Просто убедитесь, что матрица c инициализируется нулями. Вы можете просто использовать calloc вместо malloc при выделении пространства или memset выделенного массива после вызова malloc.

Еще один совет - избегать использования буквы l при доступе к элементам массива. если вы устали, вам будет трудно заметить ошибки с l против 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...