Как мне умножить две динамические матрицы в C? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь умножить две динамические матрицы, передавая их через функцию.Я получаю ошибку сегментации во время умножения.

Матрицы передаются через функцию.Элементы в аргументах верны, потому что мне пришлось использовать их для другой операции в этом проекте.У меня такое ощущение, что я испортил указатели, но я довольно плохо знаком с C и не уверен, где я испортил.

double** multiplyMatrices(
    double** a,
    const uint32_t a_rows,
    const uint32_t a_cols,
    double** b,
    const uint32_t b_cols){

    uint32_t i = 0;
    uint32_t j = 0;
    uint32_t k = 0;
    double** c;

//allocate memory to matrix c
    c = (double **)malloc(sizeof(double *) * a_rows);
    for (i = 0; i < a_rows; i++) {
        *(c +i) = (double *)malloc(sizeof(double) * b_cols);
     }

//clear matrix c
    for(i = 0; i < a_rows; i++){
        for(j = 0; j < a_cols; j++){
            *c[j] = 0;
       }
    }

    i = 0;

//multiplication
    while(j = 0, i < a_rows ){
        while(k = 0, j < b_cols){
            while(k < a_cols){
                //following line is where i'm getting the segmentation fault
                *(*(c+(i*b_cols))+j) += (*(*(a+(i*a_cols))+k)) * (*(*(b+(k*b_cols))+j));
                k++;
            }
            j++;
        }
        i++;
    }
    return c;
}

1 Ответ

0 голосов
/ 17 февраля 2019

Очевидная ошибка заключается в том, что вы разыменовываете c + i * b_cols, в то время как c является массивом указателей размера a_rows.Скорее всего, c + i * b_cols находится за пределами области, которую вы ранее выделяли с помощью malloc().

. Я бы предложил упростить представление матрицы, используя один массив double с размером, равным общему числуэлементы, т.е. строки * столбцы.

Например:

double *c;

c = malloc(sizeof(double) * a_rows * b_cols);

Это не только повышает общую производительность, но и упрощает код.Затем вам придется «линеаризовать» смещение внутри вашего одномерного массива для преобразования из двумерных координат матрицы.Например:

c[i * b_cols + j] = ...

Конечно, две другие матрицы нужно распределять, заполнять и получать к ним доступ аналогичным образом.

Для ясности кода я бы также заменил whileоператоры for операторы с фактической переменной, на которой они зациклены.Например:

for (i = 0; i < a_rows; i++)
    for (j = 0; j < b_cols; j++)
       for (k = 0; k < a_cols; k++)

Вы можете (ab) использовать язык Си разными способами, но хитрость заключается в том, чтобы в первую очередь сделать его более понятным для вас.

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