一般矩阵乘法和对称矩阵稀疏存储的乘法
对称矩阵乘法不一定是对称矩阵,如上图
//void Mul(int a[], int aRow, int aCol, int b[], int bRow, int bCol) //{ // //不具备乘法规则 // if (aCol != bRow) // return; // int sum = 0; // int *ret=new int[aRow*bCol]; // for (int i = 0; i < aRow; ++i) // { // for (int j = 0; j < bCol; ++j) // { // sum = 0; // for (int k = 0; k < bRow; ++k) // { // sum += a[i*aCol + k] * b[k*bCol + j]; // } // ret[i*bCol + j] = sum; // } // } // for (int i= 0; i < aRow; ++i) // { // for (int j = 0; j < bCol; ++j) // { // cout << ret[i*bCol + j] << " "; // } // // cout << endl; // } // delete[] ret; //} //void Test1() //{ // int arrA[2][3] = { // {1,2,3} // , {4,5,6} // }; // int arrB[3][3] = { // {1,2,3} // , {4,5,6} // , {7,8,9} // }; // Mul((int*)arrA, 2, 3, (int*)arrB, 3, 3); // //} using namespace std; template<class T> class SymmetricMatrix { protected: T* _array; size_t _size; public: SymmetricMatrix(T* array, size_t size) :_array(new T[size*(size + 1) / 2]) , _size(size) { //存储下三角 for (int i = 0; i < size; ++i) for (int j = 0; j < size; ++j) { if (i >= j) _array[i*(i + 1) / 2 + j] = array[i*size + j]; else break; } } void operator*(SymmetricMatrix<T>& s) { //不具备乘法规则 if (_size!= s._size) return; int sum = 0; int a = 0; int b = 0; int *ret = new int[_size*_size]; for (int i = 0; i < _size; ++i) { for (int j = 0; j < _size; ++j) { sum = 0; for (int k = 0; k < _size; ++k) { if (i >= k) { a=_array[i*(i + 1) / 2 + k]; } else a=_array[k*(k + 1) / 2 + i]; if (k >= j) { b = s._array[k*(k+ 1) / 2 + j]; } else { b= s._array[j*(j + 1) / 2 + k]; } sum += a*b; } ret[i*_size + j] = sum; } } for (int i = 0; i < _size; ++i) { for (int j = 0; j < _size; ++j) { cout << ret[i*_size + j] << " "; } cout << endl; } delete[] ret; } void Display() { size_t index = 0; for (int i = 0; i < _size; ++i) { for (int j = 0; j < _size; ++j) { if (i >= j) { cout << _array[i*(i + 1) / 2 + j] << " "; } else cout << _array[j*(j + 1) / 2 + i] << " "; } cout << endl; } cout << endl; } }; void Test2() { int MatrixA[3][3] = { {1,2,3} , {2,5,2} , {3,2,1} }; SymmetricMatrix<int> sm((int*)MatrixA, 3); sm.Display(); int MatrixB[3][3] = { {4,5,6} , {5,7,5} , {6,5,4} }; SymmetricMatrix<int> st((int*)MatrixB, 3); st.Display(); sm*st; }
本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1748825
原文:http://10541556.blog.51cto.com/10531556/1748825