2017-03-03 311 views
0

我创建了一个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我得到< 1,0,-1,-1>,但答案是< 2,2,2,1>。

并与上述相同的米矩阵和向量v与值

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

我得到做矩阵*标量当m * V是< 1,0,-1,2>当它应该是< 1,0,-1,0>。 我的向量类工作正常,所以我怀疑我搞砸了与数学实现矩阵操作的地方。

+0

是不是'矢量'只是一列的矩阵?如果是这样的话,为什么要把'Vector'作为一个单独的类,为什么在Matrix * Matrix应该工作时为Matrix和Vector的乘法编写一个单独的例程呢? – PaulMcKenzie

+0

@PaulMcKenzie Vector类旨在表示多个不同维度的数学向量。这是任务的一部分。我们打算练习使用内存管理,指针,运算符重载等多个类。 – crin

+0

矩阵乘以一个向量产生一个新的矩阵,而不是一个向量。你为什么要返回一个Vector?另外,即使返回了一个'Vector',为什么在错误时返回一个默认的'Vector'?我假定一个默认的'Vector'与其他向量有效,如果是这样的话,调用者不知道被返回的向量是否意味着“这是一个不好的向量”。 – PaulMcKenzie

回答

1

为了扩展@Klaus答案,在数学上表达M*V载体V,并且将结果的元素是(点状)的产品基质的V。将column(j)替换为row(j)

+0

非常感谢。显然我混淆了单词行和列,解决了这个问题,如果构造函数或操作符错误...将编辑我的答案。 – Klaus

1

我现在用手计算了你的例子,如果你期望结果是< 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的只接受载体提高了错误处理将循环中的附加代码放入第二个循环中,以使其更具可读性和可扩展性。