0
点赞
收藏
分享

微信扫一扫

【C++】C++矩阵的三元表的表示和基本操作,矩阵转置、相加、相乘。

婉殇成长笔记 2022-02-05 阅读 89
矩阵c++

1.作用:此篇文章主要是矩阵和三元表的转换,可作为空间算法优化减少内存的使用。

2.代码:

#pragma once
#include<iostream>
using namespace std;
#define M  4//稀疏矩阵行数
#define N  4//稀疏矩阵列数
#define MaxSize  16//稀疏矩阵中非0元素最多个数

typedef struct
{
	int r, c;//行(row)号与列(column)号
	int e;//元素(element)
}TupNode;//三元组定义
typedef struct
{
	int rows;//行数
	int cols;//列数
	int nums;//非0个数
	TupNode data[MaxSize];//以顺序表建立三元表
}TSMatrix;//Matrix(矩阵)

void AddArr(int a[M][N])//创建矩阵
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cin >> a[i][j];
		}
	}
}

void PrintArr(int a[M][N])//打印矩阵
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
			cout << a[i][j] << "\t";
		cout << endl;
		cout << endl;
	}
}

void Tssarr(int a[M][N], int b[N][M])//矩阵转置
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			b[j][i] = a[i][j];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++)
			cout << b[i][j] << "\t";
		cout << endl;
		cout << endl;
	}
}


int  NotZero(int a[M][N])//非0个数
{
	int LNZero = 0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (a[i][j] != 0)
			{
				LNZero++;
			}
		}
	}
	return LNZero;
}

void TGroup(int a[M][N], TSMatrix& t)//扫描矩阵,转换成三元组
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (a[i][j] != 0)
			{
				t.data[t.nums].r = i + 1;//记录行数
				t.data[t.nums].c = j + 1;//记录列数
				t.data[t.nums].e = a[i][j];
				t.nums++;//非0个数
			}
		}
	}
}

void PrintGroup(TSMatrix& t)//打印三元组1
{
	if (t.nums != 0)
	{
		for (int i = 0; i < t.nums; i++)
		{
			cout << t.data[i].r << " " << t.data[i].c << " " << t.data[i].e << endl;
		}
	}
	else
	{
		cout << "此三元表为空" << endl;
	}
}

void TssGroup(TSMatrix& t)//三元表转置
{
	for (int i = 0; i < t.nums; i++)
	{
		int temp = t.data[i].r;
		t.data[i].r = t.data[i].c;
		t.data[i].c = temp;
	}
}


void SortGroup(TSMatrix& t)//排序三元表
{
	for (int i = 0; i < t.nums - 1; i++)
	{
		for (int j = 0; j < t.nums - 1; j++)
		{
			if (t.data[j].r > t.data[j + 1].r)
			{
				TupNode temp = t.data[j];
				t.data[j] = t.data[j + 1];
				t.data[j + 1] = temp;
			}
		}
	}
}

void AddMat(int a[M][N], int c[M][N], int add[M][N])//矩阵相加
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			add[i][j] = a[i][j] + c[i][j];
		}
	}
}

void NulMat(int a[M][N], int c[M][N], int nul[M][N])//矩阵相乘
{
	int x = 0, y = 0;
	for (int i = 0; i < M; i++)
	{
		for (int m = 0; m < M; m++)
		{
			for (int n = 0; n < N; n++)
			{
				nul[x][y] += a[i][n] * c[n][m];
			}
			y++;
		}
		y = 0;
		x++;
	}
}

int main()//006
{
	int num;
	cout << "实验以 4 X 4 矩阵为例实现矩阵的基本操作" << endl;
	int a[M][N], b[N][M] = { 0 };//矩阵1
	int c[M][N], d[N][M] = { 0 };//矩阵2
	int add[M][N] = { 0 };//相加矩阵
	int nul[M][N] = { 0 };//相乘矩阵

	cout << "输入矩阵1:" << endl;
	AddArr(a);//创建矩阵a
	cout << "您输入的矩阵1为:" << endl;
	PrintArr(a);//打印矩阵
	cout << "输入矩阵2:" << endl;
	AddArr(c);//创建矩阵c
	cout << "您输入的矩阵2为:" << endl;
	PrintArr(c);//打印矩阵

	TSMatrix t0;//矩阵三元组1
	t0.nums = 0;
	TSMatrix t;//矩阵三元组2
	t.nums = 0;
	TSMatrix t1;//矩阵相加三元组
	t1.nums = 0;
	TSMatrix t2;//矩阵相乘三元组
	t2.nums = 0;
	TGroup(a, t);//扫描矩阵1,转换成三元组1
	TGroup(c, t0);//扫描矩阵2,转换成三元组2
	TssGroup(t);//三元表1转置
	TssGroup(t0);//三元表2转置
	AddMat(a, c, add);//矩阵相加
	TGroup(add, t1);//扫描矩阵,转换成相加三元组表
	NulMat(a, c, nul);//矩阵相乘

MO:
	cout << "**************************************************" << endl;
	cout << "************          选择操作         ***********" << endl;
	cout << "************ 1.1代表打印矩阵的三元组表 ***********" << endl;
	cout << "************ 2.2代表输出三元组表的逆转 ***********" << endl;
	cout << "************ 3.3矩阵相加的三元组的打印 ***********" << endl;
	cout << "************ 4.4矩阵相乘的三元组的打印 ***********" << endl;
	cout << "************ 5.0表示退出矩阵的相关操作 ***********" << endl;
	cout << "**************************************************" << endl;
	cin >> num;
	switch (num)
	{
	case 1:
	{
		cout << "矩阵1三元组表示为:" << endl;
		PrintGroup(t);//打印三元组1
		cout << "矩阵2三元组表示为:" << endl;;
		PrintGroup(t0);//打印三元组2
		goto MO;
	}
	case 2:
	{
		cout << "转置三元组表1为:" << endl;
		PrintGroup(t);//打印三元表1
		SortGroup(t);//排序三元表1
		cout << "排序三元组表1为:" << endl;
		PrintGroup(t);//打印三元表1
		cout << endl << endl;
		cout << "转置三元组表2为:" << endl;
		PrintGroup(t0);//打印三元表2
		SortGroup(t0);//排序三元表2
		cout << "排序三元组表2为:" << endl;
		PrintGroup(t0);//打印三元表2
		goto MO;
	}
	case 3:
	{
		cout << "两矩阵相加为:" << endl;
		PrintGroup(t1);//打印相加三元组
		goto MO;
	}
	case 4:
	{
		cout << "两矩阵相乘为:" << endl;
		PrintArr(nul);//打印矩阵
		goto MO;
	}
	case 0:
	{
		cout << "退出操作!" << endl;
		break;
	}
	default:
		cout << "您输入有误,请重新输入." << endl;
		goto MO;
	}
	system("pause");
	system("pause");
	return 0;
}

3.部分运算结果:

小小代码奉上,希望有所帮助。

举报

相关推荐

0 条评论