两个矩阵的乘法(索引像一维数组)

时间:2018-11-13 08:15:01

标签: c++ oop

我在

上课
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 :(得分:3)

对于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的代码中,当初始条件为false时,该函数不会返回任何内容。

答案 1 :(得分:2)

这里m1.matrix[i * temp._col + k] * m2.matrix[k * temp._col + j]; 您正在反引用矩阵m1中的项目,但是使用temp._col指定矩阵m1中的列数时,您需要使用m1._col,同时在反引用m2的项目时,您应该再次使用m2._col ,但这与temp._col相同,因此仅从可读性的角度来看很重要