Open alexey-malov opened 8 years ago
double det = Determinant(initMatrix);
if (!det)
{
std::cout << "the determinant is 0" << std::endl;
return 0;
}
SquareMatrix addMatrix = AdditionMatrix(initMatrix);
addMatrix *= (1 / det);
addMatrix.Transpose();
addMatrix.Print();
нет самого главного - функции, которая бы вернула обратную матрицу или позволила узнать о невозможности
SquareMatrix Minor(SquareMatrix &matrix, const size_t x, const size_t y)
{
size_t size = matrix.GetSize();
SquareMatrix minor(size - 1);
for (size_t i = 0, minorI = 0; i < size; i++)
if (i != x)
{
for (size_t j = 0, minorJ = 0; j < size; j++)
if (j != y)
{
minor(minorI, minorJ) = matrix(i, j);
minorJ++;
}
minorI++;
}
return minor;
}
```не экономьте на фигурных скобках в условных операторах и операторах цикла
функции, которые принимают матрицу, но не модифицируют ее, должны принимать по константной ссылке. методы структуры также придется сделать константными
SquareMatrix AdditionMatrix(SquareMatrix &matrix)
{
size_t size = matrix.GetSize();
SquareMatrix addMat(size);
for (size_t i = 0; i < size; i++)
for (size_t j = 0; j < size; j++)
addMat(i, j) = Determinant(Minor(matrix, i, j));
if (size == 1)
addMat(0, 0) = 1;
for (size_t i = 0; i < size; i++)
for (size_t j = 0; j < size; j++)
addMat(i, j) *= (i + j) % 2 == 0 ? 1.0 : -1.0;
return addMat;
}
не понятна необходимость обработки спец случая 1*1 зачем второй проход для расстановки знаков?
программа большая. попробуйте упростить
хочется, чтобы можно было написать как-то так: bool error; auto matrix = ReadMatrixFromFile(argv[1], error);
если вместо bool хочется кодов ошибок, то используйте enum вместо int