数据结构(复习)--------压缩矩阵的转置和相乘

// // 关于数据结构的总结与复习  Coding
//关于压缩矩阵转置和连乘

#include <cstdio>
#include <cstdlib>
#include <cstring> 
#define maxsize 100
#define error 0
#define ok 1
//#define _OJ_

typedef struct triple
{
    int e;
    int i;    int j;
} triple;                       //存储行列和值

typedef struct matrix
{
    triple data[maxsize];
    int col;    int row;    int cnt;
    int pos[100];             //存储非零元素在每一行的第一个元素
}matrix;

matrix
transpose_matrix(matrix M, matrix T)
{    int cnt1, col1;
    int q = 0;
    T.col = M.col;    T.row = M.row;    T.cnt = M.cnt;
    if(T.cnt != 0) {
      for (col1 = 0; col1 < M.col; col1++) {      //按照每一列去寻找
          for (cnt1 = 0; cnt1 < M.cnt; cnt1++) {
              if(M.data[cnt1].j == col1) {
                T.data[q].j = M.data[cnt1].i;
                T.data[q].i = M.data[cnt1].j;
                T.data[q].e = M.data[cnt1].e;    q++;
              }
           }
       }
    }
    return T;
}

// -------------------------------------------------------------------------------
matrix
get_pos(matrix M)
{
    int i2, i3, i4;
    int num[100];
     for (i2 = 1; i2 <= M.row; i2++)    num[i2] = 0;
    for (i3 = 1; i3 <= M.cnt; i3++)    ++num[M.data[i3].i];
    //求每一行的非零元素的个数
        M.pos[1] = 1;
    for (i4 = 2; i4 <= M.row; i4++)    M.pos[i4] = M.pos[i4 - 1] + num[i4 - 1];
    // printf("pos == %d ", M.pos[i4]);}
    return M;
}








matrix
Multi_Matrix(matrix M, matrix T, matrix Q)
{
    int num[T.col], i1, i2, p, q, ccol, t_row, num_next, num1_next;
    int arow;

    Q.row = M.row;        Q.col = T.col;    Q.cnt = 0;
    
    for (i1 = 1; i1 <= M.row; i1++) {            //对每一行进行计算
    
    for (i2 = 1; i2 <= Q.col; i2++)             //将计数器置零
        num[i2] = 0;

    if(i1 < M.row)  num_next = M.pos[i1 + 1];
    else
        num_next = M.cnt + 1;                //下一个非零位置
    for (p = M.pos[i1]; p < num_next; p++) {   //M第p行的所有非零元素
        t_row = M.data[p].j;

        if(t_row < T.cnt)  num1_next = T.pos[t_row + 1];
        else
            num1_next = T.cnt + 1;
        for (q = T.pos[t_row]; q < num1_next; q++) {
            ccol = T.data[q].j;               //N的第q(M.data[p].j)行所有元素
            num[ccol] += M.data[p].e * T.data[q].e;
        }
    }

        for (ccol = 1; ccol <= Q.col; ccol++) {
            if(num[ccol] != 0) {
            //因为num【】有可能为零所以需重新将其压缩成矩阵
                Q.data[++Q.cnt].i = i1;    Q.data[Q.cnt].j = ccol;
                Q.data[Q.cnt].e = num[ccol];
            }
        }
    }
    return  Q;
}

int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE JUDGE
       freopen("input.txt", "r", stdin);
       //freopen("output.txt", "w", stdout);
#endif
    
    int i1, i2, i3, i4;
    int num[100];
    matrix M, T, Q;
    scanf("%d %d %d", &M.row, &M.col, &M.cnt);
    // printf("%d %d %d
", M.row, M.col, M.cnt);
    for (i1 = 1; i1 <= M.cnt; i1++) {
    scanf("%d %d %d", &M.data[i1].i, &M.data[i1].j, &M.data[i1].e);
    // printf("%d %d %d
",  M.data[i1].i,  M.data[i1].j, M.data[i1].e);
    }

    scanf("%d %d %d", &T.row, &T.col, &T.cnt);
    // printf("%d %d %d
", T.row, T.col, T.cnt);
    for (i1 = 1; i1 <= T.cnt; i1++) {
    scanf("%d %d %d", &T.data[i1].i, &T.data[i1].j, &T.data[i1].e);
    // printf("%d %d %d
",  T.data[i1].i, T.data[i1].j, T.data[i1].e);    
    }

    M = get_pos(M);    T = get_pos(T);
    Q = Multi_Matrix(M, T, Q);
    for (i2 = 1; i2 <= Q.cnt; i2++) {
        printf("%d %d %d
", Q.data[i2].i, Q.data[i2].j, Q.data[i2].e);
    }

   








    // for (i1 = 0; i1 < M.cnt; i1++) {
    //     scanf("%d %d %d", &M.data[i1].i, &M.data[i1].j, &M.data[i1].e);
    //     printf("%d %d %d
", M.data[i1].i, M.data[i1].j, M.data[i1].e);
    // }
    // T = transpose_matrix(M,T);
    // printf("cnt == %d
", T.cnt);

    // for (i1 = 0; i1 < T.cnt; i1++)
    //     printf("%d %d %d
", T.data[i1].i, T.data[i1].j, T.data[i1].e);

    return 0;
}

输入:
3 4
4
1 1 3
1 4 5
2 2 -1
3 1 2
4 2
4
1 2 2
2 1 1
3 1 -2
3 2 4
输出:
1 2 6
2 1 -1
3 2 4
[Finished in 0.8s]

 

原文地址:https://www.cnblogs.com/airfand/p/5071282.html