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.部分运算结果:
小小代码奉上,希望有所帮助。