首页 > 其他 > 详细

矩阵的乘法

时间:2016-03-08 21:44:14      阅读:183      评论:0      收藏:0      [点我收藏+]

技术分享

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

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!