矩阵和向量乘法,输出不正确的产品

时间:2017-03-03 18:47:08

标签: c++ matrix vector

我创建了一个Vector和Matrix类,我正在尝试执行诸如矩阵和向量的乘法,矩阵和矩阵的乘法以及矩阵和浮点数的乘法(标量)之类的操作)。我似乎在为矩阵*向量和矩阵*矩阵获得正确的产品时遇到了问题。 以下是Matrix类用于处理这些操作的部分:

// Matrix * vector, result vector
Vector Matrix::operator*(const Vector & other) const
{
if (other.getDimensions() == 4)
{
    float floats[4];
    const float* temp = other.getData();
    for (int j = 0; j < 4; j++)
    {
        Vector myCol = column(j);
        floats[j] = (temp[0] * myCol.getData(0)) + (temp[1] * myCol.getData(1)) + (temp[2] * myCol.getData(2)) + (temp[3] * myCol.getData(3));
    }
    return Vector(floats[0], floats[1], floats[2], floats[3]);
}
else
{
    return Vector();
}
}

// Matrix * scalar, result matrix
Matrix Matrix::operator*(float c) const 
{
Matrix myMatrix;
for (int i = 0; i < 16; i++)
{
    myMatrix.data[i] = this->data[i] * c;
}
return myMatrix;
}

在我的main.cpp中,

Matrix m = Matrix(Vector(1, 0, 0, 1), Vector(0, 1, 0, 2), Vector(0, 0, 1, 3), Vector(0, 0, 0, 1));

是矩阵的值和

    v = Vector(1, 0, -1, 1);

是向量的值。 当我乘以m * v时,得到&lt; 1,0,-1,-1&gt;,但答案是&lt; 2,2,2,1&gt;。

当使用上面相同的m矩阵进行矩阵*标量和使用值

的向量v时
v = Vector(1, 0, -1, 0);

我得到m * v为&lt; 1,0,-1,2&gt;当它应该是&lt; 1,0,-1,0&gt;。 我的Vector类运行正常,所以我怀疑我搞砸了用于实现矩阵运算的数学。

2 个答案:

答案 0 :(得分:1)

我现在手动计算您的示例,如果您希望结果为&lt; 2,2,2,1&gt;,那么您肯定会在矩阵中交换行和列。将矩阵与向量相乘时,您希望将矩阵行和向量的乘积放在结果向量中。种类:

Vector Matrix::operator*(const Vector & other) const
{
    float floats[4];
    const float* temp = other.getData();
    for (int j = 0; j < 4; j++)
    {
        Vector my_row = row(j);
        floats[j] = 0;
        for(int i=0; i!=4; ++i)
            floats[j]+=temp[i] * myCol.getData(i);
    }
    //(maybe provide a better constructor to take an array)
    return Vector(floats[0], floats[1], floats[2], floats[3]);
}

对于标量的例子,我不明白这一点。如果你将矩阵与向量相乘,我不明白你期望矩阵与标量的乘法。

如果只使用大小为4的向量,你可以通过仅接受大小为4的向量(将其作为向量类中的要求)来改进错误处理。

PS:也许你应该把你的加法代码放在循环中,放到第二个循环中,这样它就更具可读性和可扩展性。

答案 1 :(得分:1)

要扩展@Klaus答案,在表达式M*V中以数学方式,向量V,结果的元素是(dot-)产品矩阵V。将column(j)替换为row(j)