zoukankan      html  css  js  c++  java
  • 数据结构(复习)--------压缩矩阵的转置和相乘

    // // 关于数据结构的总结与复习  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]
    

     

  • 相关阅读:
    匿名访问windows server 2008 R2 文件服务器的共享
    ESXI6.0新添加硬盘未能格式化成功
    vcenter server appliance(vcsa) 配置IP的方法
    Office 手动kms激活方法
    .NET Reflector注册机激活方法
    转载: 显示隐藏的断开连接的邮箱
    十步轻松搞定IIS+PHP环境搭建
    解决windows10下无法安装.net framework 3.5,错误代码0x800F081F
    Vmware Horizon 服务器替换 ssl 证书
    vmware查看HBA卡、网卡驱动、firmware版本信息
  • 原文地址:https://www.cnblogs.com/airfand/p/5071282.html
Copyright © 2011-2022 走看看