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

Matrix and vector multiplication, outputting incorrect product

本文关键字:不正确 输出      更新时间:2023-10-16

我已经创建了一个向量和矩阵类,我正在尝试执行操作,例如矩阵和向量的乘法,矩阵和矩阵的乘法以及乘法矩阵和浮点(标量)。我似乎有问题为矩阵 *向量和矩阵 *矩阵获得正确的产品。这是旨在处理这些操作的矩阵类的一部分:

// 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>,但答案是&lt; 2,2,2,1>。

以及在上面使用相同M矩阵的矩阵 *标量时,值

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

i得到m*v be&lt; 1,0,-1,2>应为&lt; 1,0,-1,0>。我的矢量类工作正常,所以我怀疑我用数学数以实现矩阵操作而搞砸了。

在@klaus答案上展开,在表达式中,数学上是 M*V中的 V是a ,结果的元素是(dot-)产物矩阵V。用column(j)替换CC_4。

我现在用手计算您的示例,如果您期望结果为&lt; 2、2、2、1>,那么您肯定会在矩阵中交换行和列。当您将矩阵乘以向量时,您想将矩阵行和向量的行的产物放在结果向量中。一种:

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:也许您还应该将添加代码放入第二个循环中,以便更可读和扩展。