C语言稀疏矩阵一次定位快速转置算法

本文介绍了一种使用C语言实现的稀疏矩阵快速转置算法,通过一次定位法来提高转置效率。该算法利用两个辅助数组记录每列非零元素的数量及在转置矩阵中的起始位置,从而实现高效转置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言稀疏矩阵一次定位快速转置算法

//稀疏矩阵一次定位快速转置算法
//4-20 by Zzzgxz

// 一次定位的位置在指的是在三元表中的位置
#include <stdlib.h>
#include<stdio.h>

#define MAXSIZE 1000

typedef struct{
    int row;
    int col;
    int e;
}Triple;

typedef struct{
    Triple data[MAXSIZE - 1];
    int m;
    int n;
    int len;
}TSMatrix;

void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B){
    /* 基于矩阵的三元组表示,采用一次定位快速转置法 */
    int col,t,p,q;
    int num[MAXSIZE]; // 用来存放三元组表A第col列中非零元素的总个数
    int position[MAXSIZE]; // 用来存放三元组表A第col列中第一个非零元素在三元组表B中的存储位置
    B->m = A.n;
    B->n = A.m;
    B->len = A.len;

    if(B->len){
        // num数组的初始化
        for(col = 1;col<=A.n;col++){
            num[col] = 0;
        }
        // 统计矩阵A中每一列元素的个数
        for(t = 1;t<=A.len;t++){
            num[A.data[t].col]++;
        }
        // A矩阵第一列的第一个元素,在矩阵B中的位置也是第一个
        position[1] = 1;
        // 初始化每一列第一个非零元素在三元表B中对应的位置
        for(col = 2;col<=A.n;col++){
            position[col] = position[col-1]+num[col-1];
        }
        // 循环A的三元表
        for(p = 1;p<=A.len;p++){
            // 查看A中第一个元素的列值
            col = A.data[p].col;
            // 查看该列第一个值在三元表B中对应的位置
            q = position[col];
            // q为该元素在B中对应的位置,直接添加过去即可
            B->data[q].row = A.data[p].col;
            B->data[q].col = A.data[p].row;
            B->data[q].e = A.data[p].e;
            // 该列的元素个数需要加一
            position[col]++;
        }
    }
}

/*
循环过程中,num 与 position 的变化
// 初始化num与position
col        1 2 3 4 5 6 
num        2 0 3 1 1 0
position   1 3 3 6 7 8 //出现8没关系,因为转置后,没有第六列了,所以无关紧要

// 在循环遍历A的过程中col与position的调用
col 4 position 6
col 3 position 3
col 1 position 1
col 3 position 4 // 因为前面已经有一个第三列的元素了,所以要+1
col 5 position 7
col 3 position 5 // 同上 col = 3 的时候


*/

int main(){
    TSMatrix A;
    TSMatrix B;

    A.m = 6;
    A.n = 5;
    A.len = 7;

    A.data[1].row = 1;
    A.data[1].col = 1;
    A.data[1].e = 3;

    A.data[2].row = 1;
    A.data[2].col = 4;
    A.data[2].e = 5;

    A.data[3].row = 2;
    A.data[3].col = 3;
    A.data[3].e = -2;

    A.data[4].row = 3;
    A.data[4].col = 1;
    A.data[4].e = 1;

    A.data[5].row = 3;
    A.data[5].col = 3;
    A.data[5].e = 4;

    A.data[6].row = 3;
    A.data[6].col = 5;
    A.data[6].e = 6;

    A.data[7].row = 5;
    A.data[7].col = 3;
    A.data[7].e = -1;

    printf("before reverse...........\n");


    for(int i = 1;i<=A.len;i++){
        printf("row: %d colume: %d value: %d\n",A.data[i].row,A.data[i].col,A.data[i].e);
    }

    printf("\n");

    FastTransposeTSMatrix(A,&B);
    
    printf("after reverse............\n");

    for(int i = 1;i<=B.len;i++){
        printf("row: %d colume: %d value: %d\n",B.data[i].row,B.data[i].col,B.data[i].e);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值