[問題] operator overloading : 矩陣乘法

看板C_and_CPP作者 (梅郭曲)時間11年前 (2015/01/22 15:33), 11年前編輯推噓0(004)
留言4則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2013 express 問題(Question): 請教一下各位高手, 小弟寫了一個 Matrix 的 class 想要用 operator overloading 的方式將" * " 定義為矩陣的乘法。 我的寫法如下: 首先用一個vector <double> VecRow作為矩陣的行; 如: 1 2 3 <- 第一個vector <double> ,裡面裝3個數字做為entry,構成第一個row 4 5 6 <- 第二個vector <double> ,裡面裝3個數字做為entry,構成第二個row 接著用一個vector <vector <double>> VecColumn 將上述的vector <double>裝起來 構成一個矩陣。 其中,private的data member: RowNum=VecRow.size(); ColumnNum=VecColumn.size(); class的大致寫法如下: 程式碼(Code):(請善用置底文網頁, 記得排版) class Matrix{ friend Matrix operator *(const double&, Matrix&); public: Matrix() = default; Matrix operator * (Matrix&); . . . private: std::vector <double> VecRow; std::vector <std::vector <double>> VecColumn; std::vector <std::string> StrDouble(std::string&); int RowNum = 0; int ColumnNum = 0; }; inline Matrix Matrix::operator * (Matrix& M2) { Matrix MM ; int M_Row = RowNum; // j: # of column int M_Column = ColumnNum; // i: # of rows int M2_Row = M2.RowNum; // j: # of column int M2_Column = M2.ColumnNum; // i: # of rows for (auto i = 0; i != M_Column; i++) { for (auto k = 0; k != M2_Row; k++) { double entry = 0.0; for (auto j = 0; j != M_Row; j++) { double T = VecColumn[i][j] * M2.VecColumn[j][k]; entry += T; } MM.VecRow.push_back(entry); } MM.VecColumn.push_back(MM.VecRow); MM.VecRow.clear(); } return MM; } 補充說明(Supplement): 我有問題的是上面的operator overloading "*" 我這樣寫後,可以做一次矩陣的乘法, 可是我想要做2次以上的矩陣連乘就什麼都跑不出來 想請問下我該怎麼修正? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.39.70 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1421912035.A.61A.html

01/22 16:39, , 1F
上面的 operator * 的引數不是應該都要是 Matrix & 嗎?
01/22 16:39, 1F

01/22 16:41, , 2F
兩個 Matrix 乘完傳回一個 Matrix
01/22 16:41, 2F

01/22 17:03, , 3F
MM的 RowNum 和 ColumnNum 沒給值,其他我測試沒問題,但不確
01/22 17:03, 3F

01/22 17:03, , 4F
但不確定你的main和constructor怎麼寫的
01/22 17:03, 4F
w大,我這樣寫是因為不希望相乘的動作修改到原先的矩陣,所以要回傳一個copy的 matrix物件 MM,加上&後compiler會解讀成是address的樣子...... 感謝t大提醒,我重新設定給RowNum跟ColumnNum的值了,不過不知為何又好像可以了Orz 我得再找找為何原先這樣不行....... ※ 編輯: skyconquer (27.147.17.196), 01/22/2015 18:08:02
文章代碼(AID): #1KmAVZOQ (C_and_CPP)