SashaOcheev / OOP

0 stars 0 forks source link

Замечания по инвертированию матриц #3

Open alexey-malov opened 8 years ago

alexey-malov commented 8 years ago
    size_t size = 0;
    int errorCode = InputFilePreview(argv[1], size);
    if (errorCode)
        return errorCode;

    std::ifstream inputFile(argv[1], std::ios_base::in);

    SquareMatrix initMatrix(size);
    initMatrix.ReadFromFile(inputFile);

хочется, чтобы можно было написать как-то так: bool error; auto matrix = ReadMatrixFromFile(argv[1], error);

если вместо bool хочется кодов ошибок, то используйте enum вместо int

alexey-malov commented 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();

нет самого главного - функции, которая бы вернула обратную матрицу или позволила узнать о невозможности

alexey-malov commented 8 years ago

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;
}
```не экономьте на фигурных скобках в условных операторах и операторах цикла
alexey-malov commented 8 years ago

функции, которые принимают матрицу, но не модифицируют ее, должны принимать по константной ссылке. методы структуры также придется сделать константными

alexey-malov commented 8 years ago
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 зачем второй проход для расстановки знаков?

alexey-malov commented 8 years ago

программа большая. попробуйте упростить