#include<iostream>
#include<windows.h>
using namespace std;
#define MAX_ROW 10
#define MAX_COLUM 10
// Matrix index from 1 not 0
struct CMatrix
{
int iMatrix[MAX_ROW][MAX_COLUM];
SIZE_T iRowLength;
SIZE_T iColumLength;
SIZE_T iCurRowIndex;
SIZE_T iCurColumIndex;
};
BOOL InitMatrix(CMatrix& sMatrix )
{
cout<<"inPut the cow size"<<endl;
cin>>sMatrix.iRowLength;
cout<<"inPut the colum size"<<endl;
cin>>sMatrix.iColumLength;
cout<<"please input the matrix data"<<endl;
for(SIZE_T i = 1; i <= sMatrix.iRowLength; i++)
{
for(SIZE_T j = 1; j <= sMatrix.iColumLength; j++)
{
cin>>sMatrix.iMatrix[i][j];
}
}
if(cin)
{
return true;
}
else
{
//recovery defualt. skip this here
return false;
}
}
int MultiMatrix(const CMatrix& sMatrix , SIZE_T iStartRow , SIZE_T iEndRow , SIZE_T iStartColum , SIZE_T iEndColum)
{
int iDestMatrix11 = 0;
int iDestMatrix12 = 0;
int iDestMatrix21 = 0;
int iDestMatrix22 = 0;
if(iEndRow - iStartRow <= 1 && iEndColum - iStartColum <= 1) // Recursion end condition
{
// iStartRow = A11 iEndRow = A21 iStartColum = A
iDestMatrix11 = sMatrix.iMatrix[iStartRow][iStartColum] * sMatrix.iMatrix[iStartRow][iStartColum] + sMatrix.iMatrix[iStartRow][iEndColum] * sMatrix.iMatrix[iEndRow][iStartColum];
iDestMatrix12 = sMatrix.iMatrix[iStartRow][iStartColum] * sMatrix.iMatrix[iStartRow][iEndColum ] + sMatrix.iMatrix[iStartRow][iEndColum] * sMatrix.iMatrix[iEndRow][iEndColum];
iDestMatrix21 = sMatrix.iMatrix[iEndRow][iStartColum] * sMatrix.iMatrix[iStartRow][iStartColum] + sMatrix.iMatrix[iEndRow][iEndColum] * sMatrix.iMatrix[iEndRow][iStartColum];
iDestMatrix22 = sMatrix.iMatrix[iEndRow][iStartColum] * sMatrix.iMatrix[iStartRow][iEndColum] + sMatrix.iMatrix[iEndRow][iEndColum] * sMatrix.iMatrix[iEndRow][iEndColum];
return iDestMatrix11 + iDestMatrix12 + iDestMatrix21 + iDestMatrix22;
}
else
{
iDestMatrix11 = MultiMatrix(sMatrix, iStartRow, (iStartRow + iEndRow) / 2 ,iStartColum , (iStartColum + iEndColum) / 2);
iDestMatrix12 = MultiMatrix(sMatrix, iStartRow, (iStartRow + iEndRow) / 2 ,(iStartColum + iEndColum) / 2 + 1 ,iEndColum);
iDestMatrix21 = MultiMatrix(sMatrix, (iStartRow + iEndRow) / 2 + 1 , iEndRow, iStartColum , (iStartColum + iEndColum) / 2);
iDestMatrix22 = MultiMatrix(sMatrix, (iStartRow + iEndRow) / 2 + 1 , iEndRow , (iStartColum + iEndColum) / 2 + 1, iEndColum);
return iDestMatrix11 + iDestMatrix12 + iDestMatrix21 + iDestMatrix22;
}
}
int main()
{
CMatrix sMatrix;
if(InitMatrix(sMatrix))
{
int iMultiMatrix = MultiMatrix(sMatrix,1,sMatrix.iRowLength,1,sMatrix.iColumLength);
cout<<"Matrix Multiply value is "<<iMultiMatrix<<endl;
}
else
{
cout<<"input date type error"<<endl;
}
getchar();
system("pause");
return 0;
}
分治 矩阵相乘
最新推荐文章于 2022-05-11 23:28:20 发布