一般矩阵乘法和对称矩阵稀疏存储的乘法
对称矩阵乘法不一定是对称矩阵,如上图
//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