稀疏矩阵转置+快速转置代码实现

本文介绍了两种矩阵转置的方法,一种是使用三元组顺序表,通过两层循环实现元素交换;另一种是优化后的快速转置算法,利用计数数组和累积和加速查找。展示了如何在C++中操作TSMatrix结构并进行矩阵转置。
void TransposeSMatrix(TSMtrix M,TSMtrix &T)//三元组顺序表
{
    M.mu = T.nu,M.nu = T.mu,T.tu = M.tu;
    int q = 1;
    for(int col = 1;col <= M.nu;col++)
        for(int p = 1;p <= M.mu; p++)
        {
            if(M.data[p].j == 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;
                q++;
            }
        }
        return;
}
#include<bits/stdc++.h>
using namespace std;

#define MAX 1001
#define OK    1
#define ERROR 0
#define TURE  1
#define FALSE 0

typedef struct 
{
    int i, j;
    int e;
}Trimple;

typedef struct 
{
    Trimple data[MAX];
    int mu,nu,tu;
}TSMatrix;

void FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
    T.mu = M.nu,T.nu = M.mu,T.tu = M.tu;
    if(T.tu)
    {
        int col,q,num[MAX],cpot[MAX];
        for(col = 1;col <= M.nu;col++)
            num[col] = 0;
        for(int i = 1;i <= M.tu;i++)
            num[M.data[i].j]++;
        cpot[1] = 1;
        for(int i = 2;i <= M.tu;i++)
            cpot[i] = cpot[i - 1] + num[i - 1];
        for(int p = 1;p <= M.tu;p++)
        {
            col = M.data[p].j;
            q = cpot[col];
            T.data[p].i = M.data[q].j;
            T.data[p].j = M.data[q].i;
            T.data[p].e = M.data[q].e;
            cpot[col]++;
        }
    }
    return;
}

int main()
{
    TSMatrix M;
    TSMatrix T;
    scanf("%d %d", &M.mu, &M.nu);
    int x,y,z;
    M.tu=0;
    for (int i = 0; ; i++)
    {
        scanf("%d%d%d", &x, &y, &z);
        if(x==0&&y==0&&z==0)break;
        M.data[i].i=x;M.data[i].j=y;M.data[i].e=z;
        M.tu++;
    }
 
    FastTransposeSMatrix(M, T);
 
    for (int t = 0; t < T.tu; t++)
        printf("%d %d %d\n", T.data[t].i, T.data[t].j, T.data[t].e);
    system("pause");
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值