/
Xakka
/
C6
Обзор
Документация
Войти
/
Xakka
/
C6
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/base.c
97 строк
3 KB
moshedur
master: release 1.0
04 янв 2025, 21:18
04 янв 2025, 21:18
5c88bf4
Код
Авторство
О чём код?
#include "base.h" /** * Вспомогательные функция расчёта минора для ij-элемента матрицы * @param minor_i i-ый номер вычеркиваемой строки * @param minor_j j-ый номер вычеркиваемого столбца * @param A исходная матрица * @param minor указатель на минор * @return OK 0, ERROR 1, CALC_ERROR 2 */ int get_minor(int minor_i, int minor_j, matrix_t* A, double* minor) { int status = OK; matrix_t tmp_matrix = {0}; if (s21_create_matrix(A->rows - 1, A->columns - 1, &tmp_matrix) != ERROR) { for (int i = 0; i < A->rows; i++) { if (i == minor_i) { continue; } for (int j = 0; j < A->columns; j++) { if (j == minor_j) { continue; } tmp_matrix.matrix[i < minor_i ? i : i - 1][j < minor_j ? j : j - 1] = A->matrix[i][j]; } } if ((status = s21_determinant(&tmp_matrix, minor)) != ERROR) { s21_remove_matrix(&tmp_matrix); } } else { status = ERROR; } return status; } /** * * Вспомогательная функция расчёта обратной матрицы * @param A указатель на исходную матрицу * @param result указатель на результирующую матрицу * @param determinant детерминант матрицы * @return OK 0, ERROR 1, CALC_ERROR 2 */ int inverse_matrix(matrix_t* A, matrix_t* result, double determinant) { int status = OK; if ((status = s21_calc_complements(A, result)) == OK) { matrix_t tmp_result = {0}; if ((status = s21_transpose(result, &tmp_result)) == OK) { s21_remove_matrix(result); status = s21_mult_number(&tmp_result, 1 / determinant, result); s21_remove_matrix(&tmp_result); } } return status; } /** * Вспомогательная функция умножения двух матриц * @param A указатель на матрицу 1 * @param B указатель на матрицу 2 * @param result указатель на результирующую матрицу */ void mult_matrix(matrix_t* A, matrix_t* B, matrix_t* result) { for (int i = 0; i < A->rows; i++) { for (int j = 0; j < B->columns; j++) { for (int k = 0; k < A->columns; k++) { result->matrix[i][j] += A->matrix[i][k] * B->matrix[k][j]; } } } } /** * Функция сложения/вычитания матрицы в зависимости от режима (mode) * @param A указатель на матрицу 1 * @param B указатель на матрицу 2 * @param result указатель на результирующую матрицу * @param mode режим вычисления: -1 вычитание; 1 сложение * @return OK 0, ERROR 1, CALC_ERROR 2 */ int sum_or_sub_matrix(matrix_t* A, matrix_t* B, matrix_t* result, int mode) { int status = OK; if (A != NULL && B != NULL && s21_create_matrix(A->rows, A->columns, result) != ERROR) { if (A->rows == B->rows && A->columns == B->columns) { for (int i = 0; i < A->rows; i++) { for (int j = 0; j < A->columns; j++) { result->matrix[i][j] = A->matrix[i][j] + B->matrix[i][j] * mode; } } } else { status = CALC_ERROR; } } else { status = ERROR; } return status; }