C++ 矩阵和向量乘法,输出不正确的乘积
我已经创建了一个Vector and Matrix类,我正在尝试执行一些操作,比如矩阵和向量的乘法,矩阵和矩阵的乘法,以及矩阵和浮点(标量)的乘法。我似乎很难得到矩阵*向量和矩阵*矩阵的正确乘积。 下面是Matrix类中用于处理这些操作的部分:C++ 矩阵和向量乘法,输出不正确的乘积,c++,matrix,vector,C++,Matrix,Vector,我已经创建了一个Vector and Matrix类,我正在尝试执行一些操作,比如矩阵和向量的乘法,矩阵和矩阵的乘法,以及矩阵和浮点(标量)的乘法。我似乎很难得到矩阵*向量和矩阵*矩阵的正确乘积。 下面是Matrix类中用于处理这些操作的部分: // Matrix * vector, result vector Vector Matrix::operator*(const Vector & other) const { if (other.getDimensions() == 4) {
// 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;
}
是矩阵和的值
v = Vector(1, 0, -1, 1);
是向量的值。
当我乘以m*v,我得到了,但答案是
当矩阵*标量与上面的m矩阵和向量v的值相同时
v = Vector(1, 0, -1, 0);
我得到了m*v,当它应该是的时候。
我的Vector类工作得很好,所以我怀疑我在实现矩阵运算时把数学搞砸了。我现在手工计算了你的示例,如果你希望得到结果,那么你肯定会交换矩阵中的行和列。当你把一个矩阵和一个向量相乘时,你想把矩阵的行和向量的乘积放到一个结果向量中。种类:
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];
常量float*temp=other.getData();
对于(int j=0;j<4;j++)
{
向量my_row=行(j);
浮点数[j]=0;
对于(int i=0;i!=4;++i)
浮动[j]+=temp[i]*myCol.getData(i);
}
//(可能提供更好的构造函数来获取数组)
返回向量(浮点[0],浮点[1],浮点[2],浮点[3]);
}
对于标量的例子,我不明白重点。我不明白,如果你将矩阵与向量相乘,你怎么会期望矩阵与标量相乘
如果只使用大小为4的向量,还可以通过只接受大小为4的向量来改进错误处理(将其作为向量类中的一个要求)
PS:也许你也应该把你的加法代码放在第二个循环中,这样它更容易阅读和扩展。我现在手工计算了你的例子,如果你希望结果是这样,那么你肯定会交换矩阵中的行和列。当你把一个矩阵和一个向量相乘时,你想把矩阵的行和向量的乘积放到一个结果向量中。种类:
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];
常量float*temp=other.getData();
对于(int j=0;j<4;j++)
{
向量my_row=行(j);
浮点数[j]=0;
对于(int i=0;i!=4;++i)
浮动[j]+=temp[i]*myCol.getData(i);
}
//(可能提供更好的构造函数来获取数组)
返回向量(浮点[0],浮点[1],浮点[2],浮点[3]);
}
对于标量的例子,我不明白重点。我不明白,如果你将矩阵与向量相乘,你怎么会期望矩阵与标量相乘
如果只使用大小为4的向量,还可以通过只接受大小为4的向量来改进错误处理(将其作为向量类中的一个要求)
PS:也许你也应该把你的加法代码放在第二个循环中,这样它更容易阅读和扩展。要在@Klaus answer上展开,在表达式
M*V
中,向量V
是一列,结果的元素是矩阵行和V
的(点)积。将列(j)
替换为行(j)
展开@Klaus answer,在表达式M*V
中,向量V
是一列,结果元素是矩阵行和V
的(点)积。将列(j)
替换为行(j)
向量不是简单的一列矩阵吗?如果是这样,为什么要将Vector
作为一个单独的类,为什么要在Matrix*Matrix
仍然可以工作的情况下编写一个单独的矩阵和向量乘法例程?@PaulMcKenzie向量类是用来表示不同维度的多个数学向量的。这是任务的一部分。我们打算练习用内存管理、指针、运算符重载等实现多个类。矩阵乘以向量将生成一个新的矩阵,而不是向量。为什么要返回向量?此外,即使返回了向量
,为什么要在错误时返回默认的向量
?我假设默认的向量
与任何其他向量一样具有有效值,如果是这种情况,调用方不知道返回的向量应该表示“这是一个坏向量”。@PaulMcKenzie只有当矩阵的维数为4时,它才应该起作用。因为矩阵m的维数为4it,向量为4x1,所以它应该返回一个向量。矩阵由行和列组成。矩阵的“4维”是什么意思?第二,这听起来有悖直觉——一个矩阵乘以一个向量,就得到了一个矩阵——你所做的是一些违反惯例的虚构数学。第三,如果一个人调用乘法函数,并且维数不是4,那么如何告知该人有错误?它们不是,相反,它们得到一个向量(),这并不表明发生了什么错误——这就是我的观点。Vector
不就是一个只有一列的矩阵吗?如果是这样,为什么要将Vector
作为一个单独的类,为什么要在Matrix*Matrix
仍然可以工作的情况下编写一个单独的矩阵和向量乘法例程?@PaulMcKenzie向量类是用来表示不同维度的多个数学向量的。这是任务的一部分。我们打算练习用内存管理、指针、运算符重载等实现多个类。矩阵乘以向量会生成一个新矩阵,而不是一个向量