(原創) 用OOP实作矩阵相乘 (C/C++)
这是我修C++的第四次作业第一题,要我们从档案读进两个矩阵,最后相乘显示结果。
此程序主要展示了用OOP的方式计算矩阵,且用了STL的vector,而非传统的array。
Matrix.h
1#ifndef IMATRIX_H
2#define IMATRIX_H
3
4#include <vector>
5
6class Matrix {
7
8 // Constructor
9public :
10 Matrix();
11 Matrix(int, int, std::vector<std::vector<int> >);
12
13 // Member Function
14public :
15 // Set row1
16 void setRow(int);
17 // Get row1
18 int getRow();
19 // Set column1
20 void setColumn(int);
21 // Get column1
22 int getColumn();
23 // Set vector1
24 void setVector(std::vector<std::vector<int> >);
25 // Get vector1
26 std::vector<std::vector<int> > getVector();
27
28 // Matrix Multiplication
29 Matrix multiply(Matrix);
30 // Print the matrix.
31 void print();
32
33 // Data Member
34private :
35 // Row of matrix1
36 int row1;
37 // Column of matrix1
38 int column1;
39 // Vector of matrix1
40 std::vector<std::vector<int> > vector1;
41
42 // Row of matrix2
43 int row2;
44 // Column of matrix2
45 int column2;
46 // Vector of matrix2
47 std::vector<std::vector<int> > vector2;
48};
49
50#endif
2#define IMATRIX_H
3
4#include <vector>
5
6class Matrix {
7
8 // Constructor
9public :
10 Matrix();
11 Matrix(int, int, std::vector<std::vector<int> >);
12
13 // Member Function
14public :
15 // Set row1
16 void setRow(int);
17 // Get row1
18 int getRow();
19 // Set column1
20 void setColumn(int);
21 // Get column1
22 int getColumn();
23 // Set vector1
24 void setVector(std::vector<std::vector<int> >);
25 // Get vector1
26 std::vector<std::vector<int> > getVector();
27
28 // Matrix Multiplication
29 Matrix multiply(Matrix);
30 // Print the matrix.
31 void print();
32
33 // Data Member
34private :
35 // Row of matrix1
36 int row1;
37 // Column of matrix1
38 int column1;
39 // Vector of matrix1
40 std::vector<std::vector<int> > vector1;
41
42 // Row of matrix2
43 int row2;
44 // Column of matrix2
45 int column2;
46 // Vector of matrix2
47 std::vector<std::vector<int> > vector2;
48};
49
50#endif
Matrix.cpp
1#include <vector>
2#include <iostream>
3#include "Matrix.h"
4
5// Constructor
6Matrix::Matrix() {
7 this->row1 = 0;
8 this->column1 = 0;
9 this->row2 = 0;
10 this->column2 = 0;
11}
12
13Matrix::Matrix(int row, int column, std::vector<std::vector<int> > vector1) {
14 this->row1 = row;
15 this->column1 = column;
16 this->vector1 = vector1;
17}
18
19// Member Function
20// Set row of matrix1
21void Matrix::setRow(int row) {
22 this->row1 = row;
23}
24
25// Get row of matrix1
26int Matrix::getRow() {
27 return this->row1;
28}
29
30// Set column of matrix1
31void Matrix::setColumn(int column) {
32 this->column1 = column;
33}
34
35// Get column of matrix1
36int Matrix::getColumn() {
37 return this->column1;
38}
39
40// Set vector of matrix1
41void Matrix::setVector(std::vector<std::vector<int> > vector) {
42 this->vector1 = vector;
43}
44
45// Get vector of matrix2
46std::vector<std::vector<int> > Matrix::getVector() {
47 return this->vector1;
48}
49
50// Matrix multiplication
51Matrix Matrix::multiply(Matrix matrix2) {
52 // Vector of matrix1
53 std::vector<std::vector<int> > matrix1Vector = this->getVector();
54 // Vector of matrix2
55 std::vector<std::vector<int> > matrix2Vector = matrix2.getVector();
56 // Vector of matrix3, the result of multiplication
57 std::vector<std::vector<int> > matrix3Vector;
58
59 // Matrix Multiplication
60 for(int i=0; i != this->getRow(); ++i) {
61 std::vector<int> rowVector;
62 for(int j=0; j != matrix2.getColumn(); ++j) {
63 int sum = 0;
64 for(int k=0; k != this->getColumn(); ++k) {
65 sum += (matrix1Vector[i][k]) * (matrix2Vector[k][j]);
66 }
67
68 rowVector.push_back(sum);
69 }
70 matrix3Vector.push_back(rowVector);
71 }
72
73 // Transfer matrix3Vector to matrix3 object.
74 Matrix matrix3(this->getRow(), matrix2.getColumn(), matrix3Vector);
75
76 return matrix3;
77}
78
79// Print the matrix
80void Matrix::print() {
81 // Print the row of matrix
82 std::cout << "Row:" << this->row1 << std::endl;
83 // Print the column of matrix
84 std::cout << "Column:" << this->column1 << std::endl;
85
86 // Print the matrix
87 for(std::vector<std::vector<int> >::const_iterator iterRow = this->vector1.begin();
88 iterRow != this->vector1.end(); ++iterRow) {
89 for(std::vector<int>::const_iterator iter = iterRow->begin();
90 iter != iterRow->end(); ++iter) {
91
92 std::cout << (*iter) << " ";
93 }
94
95 std::cout << std::endl;
96 }
97}
98
2#include <iostream>
3#include "Matrix.h"
4
5// Constructor
6Matrix::Matrix() {
7 this->row1 = 0;
8 this->column1 = 0;
9 this->row2 = 0;
10 this->column2 = 0;
11}
12
13Matrix::Matrix(int row, int column, std::vector<std::vector<int> > vector1) {
14 this->row1 = row;
15 this->column1 = column;
16 this->vector1 = vector1;
17}
18
19// Member Function
20// Set row of matrix1
21void Matrix::setRow(int row) {
22 this->row1 = row;
23}
24
25// Get row of matrix1
26int Matrix::getRow() {
27 return this->row1;
28}
29
30// Set column of matrix1
31void Matrix::setColumn(int column) {
32 this->column1 = column;
33}
34
35// Get column of matrix1
36int Matrix::getColumn() {
37 return this->column1;
38}
39
40// Set vector of matrix1
41void Matrix::setVector(std::vector<std::vector<int> > vector) {
42 this->vector1 = vector;
43}
44
45// Get vector of matrix2
46std::vector<std::vector<int> > Matrix::getVector() {
47 return this->vector1;
48}
49
50// Matrix multiplication
51Matrix Matrix::multiply(Matrix matrix2) {
52 // Vector of matrix1
53 std::vector<std::vector<int> > matrix1Vector = this->getVector();
54 // Vector of matrix2
55 std::vector<std::vector<int> > matrix2Vector = matrix2.getVector();
56 // Vector of matrix3, the result of multiplication
57 std::vector<std::vector<int> > matrix3Vector;
58
59 // Matrix Multiplication
60 for(int i=0; i != this->getRow(); ++i) {
61 std::vector<int> rowVector;
62 for(int j=0; j != matrix2.getColumn(); ++j) {
63 int sum = 0;
64 for(int k=0; k != this->getColumn(); ++k) {
65 sum += (matrix1Vector[i][k]) * (matrix2Vector[k][j]);
66 }
67
68 rowVector.push_back(sum);
69 }
70 matrix3Vector.push_back(rowVector);
71 }
72
73 // Transfer matrix3Vector to matrix3 object.
74 Matrix matrix3(this->getRow(), matrix2.getColumn(), matrix3Vector);
75
76 return matrix3;
77}
78
79// Print the matrix
80void Matrix::print() {
81 // Print the row of matrix
82 std::cout << "Row:" << this->row1 << std::endl;
83 // Print the column of matrix
84 std::cout << "Column:" << this->column1 << std::endl;
85
86 // Print the matrix
87 for(std::vector<std::vector<int> >::const_iterator iterRow = this->vector1.begin();
88 iterRow != this->vector1.end(); ++iterRow) {
89 for(std::vector<int>::const_iterator iter = iterRow->begin();
90 iter != iterRow->end(); ++iter) {
91
92 std::cout << (*iter) << " ";
93 }
94
95 std::cout << std::endl;
96 }
97}
98
Main.cpp
1#include <iostream>
2#include <fstream>
3
4#include "Matrix.h"
5
6// Read data from text file.
7void readData(Matrix&, Matrix&, const char*);
8
9int main() {
10 Matrix matrix1;
11 Matrix matrix2;
12 std::string fileName = "../data.txt";
13
14 // Read data from text file.
15 readData(matrix1, matrix2, fileName.c_str());
16
17 // matrix3 is the result of matrix1 multiply matrix2
18 Matrix matrix3 = matrix1.multiply(matrix2);
19 // Print the result of matrix3
20 matrix3.print();
21
22 return 0;
23}
24
25// Read data from text file.
26void readData(Matrix& matrix1, Matrix& matrix2,const char* fileName) {
27
28 std::ifstream infile(fileName);
29
30 if (!infile) {
31 std::cout << "Read error!!" << std::endl;
32 }
33 else {
34 char str[100];
35
36 // Row for Matrix1
37 infile >> str;
38 matrix1.setRow(atoi(str));
39
40 // Column for Matrix1
41 infile >> str;
42 matrix1.setColumn(atoi(str));
43
44 // Data for Matrix1
45 std::vector<std::vector<int> > matrix1Vector;
46 {
47 for(int i=0; i != matrix1.getRow(); ++i) {
48 std::vector<int> rowVector;
49 for(int j=0; j != matrix1.getColumn(); ++j) {
50 infile >> str;
51 rowVector.push_back(atoi(str));
52 }
53 matrix1Vector.push_back(rowVector);
54 }
55 }
56 matrix1.setVector(matrix1Vector);
57
58 // Row for Matrix2
59 infile >> str;
60 matrix2.setRow(atoi(str));
61
62 // Column for Matrix2
63 infile >> str;
64 matrix2.setColumn(atoi(str));
65
66 // Data for Matrix2
67 std::vector<std::vector<int> > matrix2Vector;
68 {
69 for(int i=0; i != matrix2.getRow(); ++i) {
70 std::vector<int> rowVector;
71 for(int j=0; j != matrix2.getColumn(); ++j) {
72 infile >> str;
73 rowVector.push_back(atoi(str));
74 }
75 matrix2Vector.push_back(rowVector);
76 }
77 }
78 matrix2.setVector(matrix2Vector);
79
80 infile.close();
81 }
82}
83
84
2#include <fstream>
3
4#include "Matrix.h"
5
6// Read data from text file.
7void readData(Matrix&, Matrix&, const char*);
8
9int main() {
10 Matrix matrix1;
11 Matrix matrix2;
12 std::string fileName = "../data.txt";
13
14 // Read data from text file.
15 readData(matrix1, matrix2, fileName.c_str());
16
17 // matrix3 is the result of matrix1 multiply matrix2
18 Matrix matrix3 = matrix1.multiply(matrix2);
19 // Print the result of matrix3
20 matrix3.print();
21
22 return 0;
23}
24
25// Read data from text file.
26void readData(Matrix& matrix1, Matrix& matrix2,const char* fileName) {
27
28 std::ifstream infile(fileName);
29
30 if (!infile) {
31 std::cout << "Read error!!" << std::endl;
32 }
33 else {
34 char str[100];
35
36 // Row for Matrix1
37 infile >> str;
38 matrix1.setRow(atoi(str));
39
40 // Column for Matrix1
41 infile >> str;
42 matrix1.setColumn(atoi(str));
43
44 // Data for Matrix1
45 std::vector<std::vector<int> > matrix1Vector;
46 {
47 for(int i=0; i != matrix1.getRow(); ++i) {
48 std::vector<int> rowVector;
49 for(int j=0; j != matrix1.getColumn(); ++j) {
50 infile >> str;
51 rowVector.push_back(atoi(str));
52 }
53 matrix1Vector.push_back(rowVector);
54 }
55 }
56 matrix1.setVector(matrix1Vector);
57
58 // Row for Matrix2
59 infile >> str;
60 matrix2.setRow(atoi(str));
61
62 // Column for Matrix2
63 infile >> str;
64 matrix2.setColumn(atoi(str));
65
66 // Data for Matrix2
67 std::vector<std::vector<int> > matrix2Vector;
68 {
69 for(int i=0; i != matrix2.getRow(); ++i) {
70 std::vector<int> rowVector;
71 for(int j=0; j != matrix2.getColumn(); ++j) {
72 infile >> str;
73 rowVector.push_back(atoi(str));
74 }
75 matrix2Vector.push_back(rowVector);
76 }
77 }
78 matrix2.setVector(matrix2Vector);
79
80 infile.close();
81 }
82}
83
84
data.txt
12 4
21 2 3 4
37 8 9 10
44 3
53 2 1
66 5 1
71 0 1
82 5 1
9
21 2 3 4
37 8 9 10
44 3
53 2 1
66 5 1
71 0 1
82 5 1
9
执行结果
1Row:2
2Column:3
326 32 10
498 104 34
5請按任意鍵繼續 . . .
2Column:3
326 32 10
498 104 34
5請按任意鍵繼續 . . .