我创建了一个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类运行正常,所以我怀疑我搞砸了用于实现矩阵运算的数学。
答案 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)
。