概述
矩阵相乘是矩阵运算中十分基本的概念。
在这里我用类的形式封装了矩阵的存储和表示。内部存储的方式是采用一维数组的形式。
另外引入了异常处理的机制。也算是对C++的基本概念进行了实际应用了。
//
error class
class BadOccur
... {
public:
BadOccur(int nErrorNum)
...{
ErrorNum = nErrorNum;
}
void BadOccurPrint()
...{
cout << ErrorNum << " error occurs!" << endl;
}
private:
int ErrorNum;
} ;
// matrix class
class CMatrix
... {
public:
CMatrix(int Row = 0, int Col = 0)
...{
if ( Row < 0 || Col < 0)
...{
throw BadOccur(2);
}
else
...{
nRows = Row;
nCols = Col;
pValueArray = new int [Row * Col];
}
}
int operator()(int Row, int Col) const //get the element from the position you have given
...{
if ( Row < 1 || Row > nRows || Col < 1 || Col > nCols)
...{
throw BadOccur(1);//cause error 1
}
return pValueArray[(Row - 1) * nCols + Col - 1];
}
int& SetData(int i, int j)//abstract the position for you to set data
...{
return pValueArray[(i - 1)* nCols + j - 1];
}
int nRows;
int nCols;
int* pValueArray;
} ;
/**/ /*
* Function Name :MultiplyMatrix
* function :multiply two matrices
* detail :none
* author :weixiong
* time :2007-2-1
* return type :bool
* return description : true two matrices has multiplied
* false two matrices can't be multiplied
* function parameters :CMatrix& MatrixA multiply matrix A and B
* CMatrix& MatrixB
*
*/
bool MultiplyMatrix(CMatrix & MatrixA, CMatrix & MatrixB, CMatrix & ResultMatrix)
... {
if (MatrixA.nCols != MatrixB.nRows)
...{
return false;
}
else
...{
int Sum = 0;
for (int Row = 1; Row <= MatrixA.nRows; Row++)
...{
for (int Col = 1; Col <= MatrixB.nCols; Col++)
...{
for (int i = 1; i <= MatrixA.nCols; i++)
...{
Sum = Sum + MatrixA(Row, i) * MatrixB(i, Col);
}
ResultMatrix.pValueArray[(Row - 1) * MatrixB.nCols + Col - 1] = Sum;
}
}
return true;
}
}
int main()
... {
try
...{
//CMatrix ErrorMatrix(-1, 0);//example of cause error 2
int Row1 = 0;
int Col1 = 0;
cout << "Please enter the row and col for the first matrix." << endl;
cin >> Row1 >> Col1;
int Num = 1;
CMatrix MatrixA(Row1, Col1);
for (int i = 1; i <= Row1; i++)
...{
for (int j = 1; j <= Col1; j++)
...{
MatrixA.SetData(i, j) = Num++;
}
}
//int a = MatrixA(0, 2);//example of cause error 1
int Row2 = 0;
int Col2 = 0;
cout << "Please enter the row and col for the second matrix." << endl;
cin >> Row2 >> Col2;
Num = 1;
CMatrix MatrixB(Row2, Col2);
for (int i = 1; i <= Row2; i++)
...{
for (int j = 1; j <= Col2; j++)
...{
MatrixB.SetData(i, j) = Num++;
}
}
CMatrix ResultMatrix(Row1, Col2);
MultiplyMatrix(MatrixA, MatrixB, ResultMatrix);
getchar();
}
catch(BadOccur m)
...{
m.BadOccurPrint();
}
}
class BadOccur
... {
public:
BadOccur(int nErrorNum)
...{
ErrorNum = nErrorNum;
}
void BadOccurPrint()
...{
cout << ErrorNum << " error occurs!" << endl;
}
private:
int ErrorNum;
} ;
// matrix class
class CMatrix
... {
public:
CMatrix(int Row = 0, int Col = 0)
...{
if ( Row < 0 || Col < 0)
...{
throw BadOccur(2);
}
else
...{
nRows = Row;
nCols = Col;
pValueArray = new int [Row * Col];
}
}
int operator()(int Row, int Col) const //get the element from the position you have given
...{
if ( Row < 1 || Row > nRows || Col < 1 || Col > nCols)
...{
throw BadOccur(1);//cause error 1
}
return pValueArray[(Row - 1) * nCols + Col - 1];
}
int& SetData(int i, int j)//abstract the position for you to set data
...{
return pValueArray[(i - 1)* nCols + j - 1];
}
int nRows;
int nCols;
int* pValueArray;
} ;
/**/ /*
* Function Name :MultiplyMatrix
* function :multiply two matrices
* detail :none
* author :weixiong
* time :2007-2-1
* return type :bool
* return description : true two matrices has multiplied
* false two matrices can't be multiplied
* function parameters :CMatrix& MatrixA multiply matrix A and B
* CMatrix& MatrixB
*
*/
bool MultiplyMatrix(CMatrix & MatrixA, CMatrix & MatrixB, CMatrix & ResultMatrix)
... {
if (MatrixA.nCols != MatrixB.nRows)
...{
return false;
}
else
...{
int Sum = 0;
for (int Row = 1; Row <= MatrixA.nRows; Row++)
...{
for (int Col = 1; Col <= MatrixB.nCols; Col++)
...{
for (int i = 1; i <= MatrixA.nCols; i++)
...{
Sum = Sum + MatrixA(Row, i) * MatrixB(i, Col);
}
ResultMatrix.pValueArray[(Row - 1) * MatrixB.nCols + Col - 1] = Sum;
}
}
return true;
}
}
int main()
... {
try
...{
//CMatrix ErrorMatrix(-1, 0);//example of cause error 2
int Row1 = 0;
int Col1 = 0;
cout << "Please enter the row and col for the first matrix." << endl;
cin >> Row1 >> Col1;
int Num = 1;
CMatrix MatrixA(Row1, Col1);
for (int i = 1; i <= Row1; i++)
...{
for (int j = 1; j <= Col1; j++)
...{
MatrixA.SetData(i, j) = Num++;
}
}
//int a = MatrixA(0, 2);//example of cause error 1
int Row2 = 0;
int Col2 = 0;
cout << "Please enter the row and col for the second matrix." << endl;
cin >> Row2 >> Col2;
Num = 1;
CMatrix MatrixB(Row2, Col2);
for (int i = 1; i <= Row2; i++)
...{
for (int j = 1; j <= Col2; j++)
...{
MatrixB.SetData(i, j) = Num++;
}
}
CMatrix ResultMatrix(Row1, Col2);
MultiplyMatrix(MatrixA, MatrixB, ResultMatrix);
getchar();
}
catch(BadOccur m)
...{
m.BadOccurPrint();
}
}
最后
以上就是简单樱桃为你收集整理的数组与矩阵(1)_矩阵相乘的全部内容,希望文章能够帮你解决数组与矩阵(1)_矩阵相乘所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复