Блок задач

3. Структуры данных

Сложность 5

Задача «Матрица»

Реализовать структуру Matrix для матриц размера N*M и ф-ии для работы с ними по указанному интерфейсу:

typedef struct {
    //
} Matrix;

Matrix create_empty();
Matrix create_vector(size_t cols);
Matrix create(size_t rows, size_t cols);
Matrix create_identity(size_t rows, size_t cols);
Matrix create_zero(size_t rows, size_t cols);
Matrix create_constants(size_t rows, size_t cols, double value);
void destroy(Matrix* mat);

Matrix multiply(Matrix* mat1, Matrix* mat2);
Matrix subtract(Matrix* mat1, Matrix* mat2);
Matrix add(Matrix* mat1, Matrix* mat2);
Matrix multiply_scalar(Matrix* mat, double value);
Matrix divide_scalar(Matrix* mat, double value);

bool is_valid(Matrix* mat);
void resize(Matrix* mat, size_t rows, size_t cols);

double get_element(Matrix* mat, size_t rowIdx, size_t colIdx);
void set_element(Matrix* mat, size_t rowIdx, size_t colIdx, double value);

void set_identity(Matrix* mat);
void set_zero(Matrix* mat);
void set_constants(Matrix* mat, double value);

void set_identity_resize(Matrix* mat, size_t rows, size_t cols);
void set_zero_resize(Matrix* mat, size_t rows, size_t cols);
void set_constants_resize(Matrix* mat, size_t rows, size_t cols, double value);

Matrix transpose(Matrix* mat);
Matrix inverse(Matrix* mat);
double determinant(Matrix* mat);

Описание функций:

  • create_empty - создает пустую структуру матрицы
  • create_vector - создает вектор-строку заданного размера
  • create - создает матрицу заданного размера
  • create_identity - создает единичную матрицу заданного размера
  • create_zero - создает нулевую матрицу заданного размера
  • create_constants - создает матрицу с константными значениями заданного размера
  • destroy - освобождает память, занятую матрицей
  • multiply - выполняет умножение двух матриц
  • subtract - выполняет вычитание двух матриц
  • add - выполняет сложение двух матриц
  • multiply_scalar - умножает матрицу на скалярное значение
  • divide_scalar - делит матрицу на скалярное значение
  • is_valid - проверяет валидность матрицы
  • resize - изменяет размер матрицы
  • get_element - возвращает значение элемента по индексам
  • set_element - устанавливает значение элемента по индексам
  • set_identity - преобразует существующую матрицу в единичную
  • set_zero - заполняет матрицу нулевыми значениями
  • set _constants - заполняет матрицу константным значением
  • set_identity _resize - изменяет размер матрицы и делает её единичной
  • set_zero _resize - изменяет размер матрицы и заполняет нулями
  • set_constants _resize - изменяет размер матрицы и заполняет константным значением
  • transpose - возвращает транспонированную матрицу
  • inverse - возвращает обратную матрицу
  • determinant - вычисляет определитель матрицы

Работу всех функций ОБЯЗАТЕЛЬНО проверить с помощью unit-тестов!

Тесты должны проверять как типовые, так и граничные случаи.