Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矩阵和向量乘法,输出不正确的乘积_C++_Matrix_Vector - Fatal编程技术网

C++ 矩阵和向量乘法,输出不正确的乘积

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) {

我已经创建了一个Vector and 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;
}
是矩阵和的值

    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向量类是用来表示不同维度的多个数学向量的。这是任务的一部分。我们打算练习用内存管理、指针、运算符重载等实现多个类。矩阵乘以向量会生成一个新矩阵,而不是一个向量