矩阵的乘法

矩阵的乘法_第1张图片

一般矩阵乘法和对称矩阵稀疏存储的乘法

对称矩阵乘法不一定是对称矩阵,如上图

//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;
}


你可能感兴趣的:(矩阵乘法)