目录
矩阵的转置
/*
* 矩阵A:原矩阵
* 矩阵B:转置后的矩阵
* m:矩阵A的行
* n:矩阵A的列
*/
void trsmat(int A[][MaxSize], int B[][MaxSize], int m, int n) {
for (int i = 0; i < m; ++i) { //行
for (int j = 0; j < n; ++j) { //列
B[j][i] = A[i][j];
}
}
}
矩阵的相加
/*
* 矩阵A:待加矩阵
* 矩阵B:待加矩阵
* 矩阵C:结果矩阵
* m:矩阵行
* n:矩阵列
*/
void addMat(int C[][MaxSize], int A[][MaxSize], int B[][MaxSize], int m, int n) {
for (int i = 0; i < m; ++i) { //行
for (int j = 0; j < n; ++j) { //列
C[i][j] = A[i][j] + B[i][j]; //对应位相加
}
}
}
矩阵相乘
/*
* 矩阵A:待乘矩阵
* 矩阵B:待乘矩阵
* 矩阵C:结果矩阵
* m:左矩阵行
* n:左矩阵列,也是右矩阵行
* k:右矩阵列
*/
void mutMat(int C[][MaxSize], int A[][MaxSize], int B[][MaxSize], int m, int n, int k) {
for (int i = 0; i < m; ++i) { //结果矩阵的行
for (int j = 0; j < k; ++j) { //结果矩阵的列
C[i][j] = 0; //将即将得结果的位置置0
for (int h = 0; h < n; ++h) { //对应位置相乘后相加
C[i][j] += A[i][h] * B[h][j];
}
}
}
}
三元组表示法定义
typedef struct {
ElemType val; //元素值
int i, //元素所在行
j; //元素所在列
}TriMat;
稀疏矩阵转换为三元组表示
//统计非0元个数
int countValNot0(ElemType A[][MaxSize],int m,int n) {
int count = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (A[i][j]!= 0) {
count++;
}
}
}
return count;
}
//稀疏矩阵转三元组表示
TriMat* matToTriMat(ElemType A[][MaxSize], int m, int n) {
//统计飞0元个数
int count = countValNot0(A, m, n);
//申请存储空间
TriMat* triMat = (TriMat*)malloc(sizeof(TriMat) * (count + 1));
//用三元组存储稀疏矩阵
//下标0:记录非0元个数,原矩阵的总行数,总列数
triMat[0].val = count;
triMat[0].i = m;
triMat[0].j = n;
int index = 1;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (A[i][j] != 0) { //存储非0元
triMat[index].val = A[i][j];
triMat[index].i = i;
triMat[index].j = j;
index++;
}
}
}
return triMat;
}
打印三元组表示的稀疏矩阵
void printTriMat(TriMat triMat[]) {
int index = 1;
//下标0处的存储:总的非0元个数。原矩阵的行数,原矩阵的列数
for (int i = 0; i < triMat[0].i; ++i) { //原矩阵的行
for (int j = 0; j < triMat[0].j; ++j) { //原矩阵的列
if (triMat[index].i == i
&& triMat[index].j == j) { //这个位置有非0元素
cout << triMat[index].val << "\t";
index++;
}
else { //这个位置是0元素
cout << 0 << "\t";
}
}
cout << endl;
}
}
十字链表描述
typedef struct OLNode {
int row, //存储的非0元素的行下表
col; //存储的非0元素的列下表
struct OLNode* right, //指向同一行的右侧的结点
* down; //指向同一列的下侧的结点
float val; //非0元素值
}OLNode;
typedef struct {
OLNode* upHeadArray, //上侧的头结点数组
* leftHeadArray; //左侧的头结点数组
int rows, //矩阵总的行数
cols, //矩阵总的列数
notZeroTptal; //矩阵总的非0元个数
}CrossList;