首页 > 编程语言 >稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现

稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现

时间:2023-08-27 11:37:40浏览次数:62  
标签:转置 矩阵 C++ thMatrix int 三元组 data col


/*稀疏矩阵的压缩存储及转置*/

#include <iostream>
using namespace std;

/*三元组顺序表的类型定义*/
#define itemSize 100

typedef struct
{
    int row,col;
    int item;
}thNode;

typedef struct
{
    thNode * data;//data[0]不用
    int m,n,t;//分别表示行数、列数和非零元素个数
}thMatrix;


/*初始化三元组表*/
void initMatrix_Th(thMatrix &M)
{
    M.data=new thNode[itemSize+1];
    M.m=0;
    M.n=0;
    M.t=0;
}

/*转置三元组表*/

//一般方法,算法时间复杂度较高
void  transMatrix_1(thMatrix M,thMatrix &T)
{
    initMatrix_Th(T);
    T.m=M.n;
    T.n=M.m;
    T.t=M.t;

    if(T.t)
    {
        int p=1;//用来指M中的元素
        int q=1;//用来指T中的元素
        int col;//用来遍历列中的元素

        for(col=1;col<=M.n;col++)
        {
            for(p;p<=M.t;p++)
            {
                if(M.data[p].col==col)
                {
                    T.data[q].row=M.data[p].col;
                    T.data[q].col=M.data[p].row;
                    T.data[q].item=M.data[p].item;
                    q++;
                }
            }
        }
    }
}

//改进的方法——快速转置
void transMatrix_2(thMatrix M,thMatrix &T)
{
    initMatrix_Th(T);
    T.m=M.n;
    T.n=M.m;
    T.t=M.t;

    int i,j,p,q;
    int num[100];
    int cpot[100];
    if(T.t)
    {
        for(i=1;i<=M.n;i++)
            num[i]=0;//M中每一列的非零元素个数初始化为0
        for(i=1;i<=M.t;i++)
            ++num[M.data[i].col];//M中每一列的非零元素个数存储到一个数组中
        cpot[1]=1;
        for(i=2;i<=M.n;i++)
            cpot[i]=cpot[i-1]+num[i-1];//每一列第一个非零元素的位置
        for(p=1;p<=M.t;p++)
        {
            j=M.data[p].col;
            q=cpot[j];//确定第j列第一个非零元素的位置

            T.data[q].row=M.data[p].col;
            T.data[q].col=M.data[p].row;
            T.data[q].item=M.data[p].item;
            ++cpot[j];//指向下一个位置
        }
    }
}


/*创建一个三元组表*/

//按行优先存储
void creatMatrix(thMatrix &M,int n)
{
    initMatrix_Th(M);

    int i;
    cin>>M.m>>M.n;
    for(i=1;i<=n;i++)
    {
        cin>>M.data[i].row>>M.data[i].col>>M.data[i].item;
    }
    M.t=n;
}

/*输出一个三元组表*/
void outputMatrix(thMatrix M)
{
    int i;
    cout<<M.m<<" "<<M.n<<endl;
    cout<<M.t<<endl;
    for(i=1;i<=M.t;i++)
    {
        cout<<M.data[i].row<<" "<<M.data[i].col<<" "<<M.data[i].item<<endl;
    }
}

void main()
{
    thMatrix M;
    thMatrix T;

    creatMatrix(M,8);
    //outputMatrix(M);
    transMatrix_2(M,T);
    outputMatrix(T);
}

 

标签:转置,矩阵,C++,thMatrix,int,三元组,data,col
From: https://blog.51cto.com/u_5173797/7251975

相关文章

  • 选择排序——简单选择排序和堆排序,C++代码实现
    #include<iostream>usingnamespacestd;typedefstruct{ intr[100+1]; intlength;}SqList;//简单选择排序voidSimpleSlectSort(SqList&L){ intmin,i,j; for(i=1;i<L.length;i++) { min=i; for(j=i+1;j<=L.length;j++) if(L.r[j]<L.r[m......
  • 循环队列的定义、入队、出队等操作 C++代码实现
    #include<iostream>usingnamespacestd;/*循环队列的类型定义*/constintQueue_Size=100;typedefstructcirclQueue{char*elem;intrear;intfront;intqueueSize;}circlQueue;/*初始化*/voidinitQueue_C(circlQueue&......
  • 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现
     #include<iostream>usingnamespacestd;/*顺序栈的定义*/#defineStack_Size100typedefstructsqStack{char*elem;inttop;intstackSize;//栈数组长度}sqStack;/*顺序栈的初始化*/voidinitStack_Sq(sqStack&S){S.elem=ne......
  • 用线性表实现的通讯录管理 C++代码
    /****************************************//*主控菜单处理测试程序main2.c************//***************************************/#include<iostream>#include<string>usingnamespacestd;#defineLIST_INIT_SIZE100#defineLISTINCREMENT10intOK=......
  • 用单链表实现一元多项式相加 C++代码
     #include<iostream>usingnamespacestd;/*结点的定义*/typedefstructLNode{floatcoef;intexp;structLNode*next;}LNode;typedefLNode*Polynomial;/*多项式的初始化*/voidinitDuoX(Polynomial&Px){Px=newLNode;......
  • 双链表的定义、初始化、插入、删除,C++代码实现的算法
    #include<iostream>usingnamespacestd;/*双向链表类型定义*/typedefstructduNode{chardata;structduNode*prior;structduNode*next;}duNode;typedefduNode*duLinklist;//指针类型,故访问它的成员用“->”。/*初始化双向链表*/voidinitLinkl......
  • 链队列的实现,C++代码实现
    /*链队列的实现*/#include<iostream>usingnamespacestd;/*链队列类型定义*/typedefstructQNode{structQNode*next;chardata;}QNode,*queuePtr;//结点的定义typedefstructlinkQueue{queuePtrrear;queuePtrfront;}linkQueue;//队列的定......
  • 基于QT和C++实现的停车场管理系统
    基于QT和C++实现的停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只能在门外的狭长便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入。每辆停放在......
  • 力扣-2. 两数相加(C++题解)
    题目链接:https://leetcode.cn/problems/add-two-numbers/description/给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之......
  • C++11 右值引用&&、移动语义std::move、完美转发std::forward
    参考:https://blog.csdn.net/HR_Reborn/article/details/130363997 #pragmaonceclassArray{public:Array():size_(0),data_(nullptr){}Array(intsize):size_(size){data_=newint[size_];}//复制构造函数(深拷贝构造)A......