Умножение одной прямоугольной матрицы на другую - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Пожалуйста подскажите формулу умножение прямоугольной матрицы на другую. Надо сделать задание: Используя функцию, написать программу. Написать функцию вычисления произведения прямоугольной матрицы A размера k x m на прямоугольную матрицу B размера m x n. В главной программе обратиться к этой функции.

Решение задачи: «Умножение одной прямоугольной матрицы на другую»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct MATRIX {
    double ** data;
    size_t rows;
    size_t columns;
} matrix_t;
 
matrix_t * matrix_new(size_t rows, size_t columns) {
    size_t i;
    matrix_t * pMatrix;
        
    if ( ! ( pMatrix = malloc(sizeof(matrix_t)) ) )
        return NULL;
 
    if ( ! ( pMatrix->data = malloc(sizeof(double*) * rows) ) ) {
        free(pMatrix);
        return NULL;
    }
    for ( i = 0; i < rows; ++i ) {
        if ( ! ( pMatrix->data[i] = malloc(sizeof(double) * columns) ) ) {
            while ( i )
                free(pMatrix->data[--i]);
            free(pMatrix->data);
            free(pMatrix);
            return NULL;
        }
    }
    
    pMatrix->rows = rows;
    pMatrix->columns = columns;
    
    return pMatrix;
}
 
matrix_t * matrix_new_from_array(size_t rows, size_t columns, const double * pArray) {
    size_t i, j;
    matrix_t * pMatrix;
    
    if ( ! ( pMatrix = matrix_new(rows, columns) ) )
        return NULL;
    
    for ( i = 0; i < rows; ++i )
        for ( j = 0; j < columns; ++j )
            pMatrix->data[i][j] = *(pArray + i * columns + j);
    
    return pMatrix;
}
 
void matrix_free(matrix_t * pMatrix) {
    size_t i;
    
    for ( i = 0; i < pMatrix->rows; ++i )
        free(pMatrix->data[i]);
    free(pMatrix->data);
    free(pMatrix);
}
 
void matrix_dump(const matrix_t * pMatrix, size_t width, size_t precision) {
    size_t i, j;
    
    for ( i = 0; i < pMatrix->rows; ++i ) {
        for ( j = 0; j < pMatrix->columns; ++j )
            printf("%*.*f", width, precision, pMatrix->data[i][j]);
        printf("\n");
    }
}
 
matrix_t * matrix_mul(const matrix_t * pMatrixA, const matrix_t * pMatrixB) {
    matrix_t * pMatrixC;
    size_t i, j, k;
    
    if ( pMatrixA->columns != pMatrixB->rows )
        return NULL;
    
    if ( ! ( pMatrixC = matrix_new(pMatrixA->rows, pMatrixB->columns) ) )
        return NULL;
    
    for ( i = 0; i < pMatrixC->rows; ++i ) {
        for ( j = 0; j < pMatrixC->columns; ++j ) {
            pMatrixC->data[i][j] = 0.0;
            
            for ( k = 0; k < pMatrixA->columns; ++k )
                pMatrixC->data[i][j] += pMatrixA->data[i][k] * pMatrixB->data[k][j];
        }
    }
    
    return pMatrixC;
}
 
int main(void) {
    double arrA[] = { 1., 2., 3., 4., 5., 6. };
    double arrB[] = { 7., 8., 9., 10., 11., 12. };
    matrix_t * mA = matrix_new_from_array(2, 3, arrA);
    matrix_t * mB = matrix_new_from_array(3, 2, arrB);
    matrix_t * mC = matrix_mul(mA, mB);
    
    printf("First matrix:\n");
    matrix_dump(mA, 4, 0);
    printf("\nSecond matrix:\n");
    matrix_dump(mB, 4, 0);
    
    printf("\nMultipled matrix:\n");
    matrix_dump(mC, 4, 0);
    
    matrix_free(mA);
    matrix_free(mB);
    matrix_free(mC);
    
    return 0;
}

Объяснение кода листинга программы

  1. Объявлен тип структуры MATRIX и функция matrix_new, которая создает новую матрицу заданного размера. Функция использует двойную динамическую аллокацию для выделения памяти под матрицу и ее элементы.
  2. Объявлен тип функции matrix_new_from_array, которая создает новую матрицу из двумерного массива.
  3. Объявлен тип функции matrix_free, которая освобождает память, выделенную под матрицу.
  4. Объявлен тип функции matrix_dump, которая выводит содержимое матрицы в удобочитаемом формате.
  5. Объявлен тип функции matrix_mul, которая умножает две матрицы. Функция проверяет, совпадает ли количество столбцов первой матрицы с количеством строк второй матрицы. Если нет, возвращается NULL. В противном случае создается новая матрица, и в ней производится умножение элементов двух матриц.
  6. В функции main создаются две матрицы mA и mB из двумерных массивов arrA и arrB.
  7. Создается третья матрица mC, которая является результатом умножения mA на mB.
  8. Выводится содержимое всех трех матриц.
  9. Матрицы mA, mB и mC освобождаются от памяти.
  10. Программа возвращает 0, что означает успешный конец работы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы