这行代码的意义在于为矩阵转置做好了基础工作,即确定了转置后矩阵的大小和非零元素个数。因为矩阵转置后,原来的行变成了列,原来的列变成了行,所以转置后矩阵的行数等于原矩阵的列数,转置后矩阵的列数等于原矩阵的行数,而非零元素个数不会改变。因此,这行代码的作用是将原矩阵的行数赋值给转置后矩阵的列数,将原矩阵的列数赋值给转置后矩阵的行数,将原矩阵的非零元素个数赋值给转置后矩阵的非零元素个数,为矩阵转置做好了基础工作。
#include <stdio.h>
#define MAXSIZE 100
typedef struct {
int i, j;
int e;
} Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int mu, nu, tu;
} TSMatrix;
void TransposeSMatrix(TSMatrix M, TSMatrix *T) {
int p, q, col;
int num[M.nu + 1], cpot[M.nu + 1];
T->mu = M.nu;
T->nu = M.mu;
T->tu = M.tu;//这段代码来确定转置的行列个数
if (T->tu) {
for (col = 1; col <= M.nu; col++) {//
num[col] = 0;
}
for (p = 1; p <= M.tu; p++) {
col = M.data[p].j;
num[col]++;
}
cpot[1] = 1;
for (col = 2; col <= M.nu; col++) {
cpot[col] = cpot[col - 1] + num[col - 1];
}
for (p = 1; p <= M.tu; p++) {
col = M.data[p].j;
q = cpot[col];
T->data[q].i = M.data[p].j;
T->data[q].j = M.data[p].i;
T->data[q].e = M.data[p].e;
cpot[col]++;
}
}
}
int main() {
TSMatrix M, T;
int m, n, t, i, j, e;
printf("请输入矩阵的行数、列数和非零元素个数:\n");
scanf("%d%d%d", &m, &n, &t);
M.mu = m;
M.nu = n;
M.tu = t;
printf("请输入矩阵的三元组:\n");
for (i = 1; i <= t; i++) {
scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e);//这里的代表第i个数据
}
TransposeSMatrix(M, &T);
printf("转置后的矩阵的三元组为:\n");
for (i = 1; i <= T.tu; i++) {
printf("%d %d %d\n", T.data[i].i, T.data[i].j, T.data[i].e);
}
return 0;
}