2017-03-03 162 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的只接受載體提高了錯誤處理將循環中的附加代碼放入第二個循環中,以使其更具可讀性和可擴展性。