【发布时间】:2026-01-28 07:55:02
【问题描述】:
我创建了一个向量和矩阵类,我正在尝试执行诸如矩阵和向量的乘法、矩阵和矩阵的乘法以及矩阵和浮点数(标量)的乘法之类的操作。我似乎在为矩阵 * 向量和矩阵 * 矩阵获取正确的产品时遇到问题。 这是 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 我得到 ,但答案是 。
当使用上面相同的 m 矩阵和带有值的向量 v 进行矩阵 * 标量时
v = Vector(1, 0, -1, 0);
当 m*v 应该是 时,我得到 m*v 是 。 我的 Vector 类工作正常,所以我怀疑我在某个地方搞砸了用于实现矩阵运算的数学。
【问题讨论】:
-
Vector不就是一个只有一列的矩阵吗?如果是这样,为什么要让Vector成为一个单独的类,为什么在Matrix * Matrix仍然可以工作的情况下编写一个单独的例程用于矩阵和向量的乘法? -
@PaulMcKenzie Vector 类旨在表示多个不同维度的数学向量。这是任务的一部分。我们的目的是练习使用内存管理、指针、运算符重载等实现多个类。
-
矩阵乘以向量产生一个新矩阵,而不是向量。你为什么要返回一个向量?此外,即使返回了
Vector,为什么在出错时返回默认的Vector?我假设默认Vector具有与任何其他向量一样的有效值,如果是这种情况,调用者不知道返回的向量应该意味着“这是一个坏向量”。 -
@PaulMcKenzie 好吧,只有当矩阵的维度为 4 时,它才应该起作用。由于矩阵 m 的维度确实为 4,并且向量为 4 x 1,因此它应该返回一个向量。
-
一个矩阵由行和列组成。矩阵的“维度为 4”是什么意思?其次,这一切听起来都违反直觉——矩阵乘以向量,得到一个矩阵——你正在做的是一些违反惯例的虚构数学。第三,如果一个人调用了multiply函数,并且维度不是4,那这个人怎么知道有错误?他们不是,相反,他们得到了一个 Vector() 被扔回给他们,这并不表示发生了错误——这就是我的观点。