Умножение двух матриц (индексы как одномерный массив) - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть класс с

double *matrix;
int _row;
int _col;

в цикле:

for (int i = 0; i < _row; i++) {
        for (int j = 0; j < _col; j++) {
            matrix[i * _col + j] = 0.0;
        }
}

Мне нужно умножить две матрицы и получить новую:

Matrix MatrixOperations::Mul(const Matrix &m1, const Matrix &m2) {
if (m1.CheckMul(m2)) {
    Matrix temp(m1._row, m2._col);
    for (int i = 0; i < temp._row; i++) {
        for (int j = 0; j < temp._col; j++) {
            for (int k = 0; k <= temp._col; k++) {
                temp.matrix[i * temp._col + j] += m1.matrix[i * temp._col + k] * m2.matrix[k * temp._col + j];
            }
        }
    }
    return temp;
}
}

Код указан неверно.Я думаю, что индексы неверны, но я не могу ни понять, ни увидеть, какие именно.

У кого-нибудь есть идеи?Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Для k-петли следует использовать общий размер, а не temp._col.Также обратите внимание, что условие k <= number_of_columns ведет к выходу за пределы.

Matrix MatrixOperations::Mul(const Matrix &m1, const Matrix &m2)
{
    if (m1._col != m2._row) // Assuming that's what '!m1.CheckMul(m2)' does
    {
        throw std::runtime_error("The inner dimensions should be the same");
    }

    Matrix temp(m1._row, m2._col);
    for (int i = 0; i < temp._row; i++)
    {
        for (int j = 0; j < temp._col; j++)
        {
            for (int k = 0; k < m1._col; k++)
            {
                temp.matrix[i * temp._col + j] += m1.matrix[i * m1._col + k] * m2.matrix[k * m2._col + j];
            }
        }
    }
    return temp;
}

Также обратите внимание, что в коде OP, когда начальное условие ложно, функция ничего не возвращает.

0 голосов
/ 13 ноября 2018

Здесь m1.matrix[i * temp._col + k] * m2.matrix[k * temp._col + j]; Вы разыменовываете элемент в матрице m1, но, используя temp._col для указания количества столбцов в матрице m1, вам необходимо использовать m1._col, также при разыменовании элемента m2 выследует снова использовать m2._col, но это то же самое, что и temp._col, поэтому это имеет значение только с точки зрения читаемости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...