首页 > 其他分享 >稀疏矩阵快速转置

稀疏矩阵快速转置

时间:2023-10-17 15:11:51浏览次数:33  
标签:零元 转置 矩阵 稀疏 int num cpot

如果需要将一个使用三元组形式存储的稀疏矩阵进行转置,当然可以直接交换每一个结点的行和列。但这样做的问题在于,原矩阵是按行数升序排列的,转置之后的矩阵就会变为无序的。
快速转置算法的目的就在于得到一个同样有序排列的转置后矩阵。

三元组和稀疏数组定义

#define MAXSIZE 12500

typedef int ElemType;
typedef struct {
    int i, j;
    ElemType e;
} Triple;
typedef struct {
    Triple data[MAXSIZE + 1];
    int mu, nu, tu; // 行数 列数 非零元个数
} TSMatrix;

如果我们能在进行转置之前就知道原矩阵的每一个非零元将位于新矩阵的哪个位置,就可以直接将其放在对应位置上,进而就可以得到有序的新矩阵。

需要借助两个额外的矩阵:

  1. num[]表示原矩阵每列中非零元的个数。
  2. cpot[]表示原矩阵中每一列的第一个非零元在新矩阵(也就是新矩阵每一行)中的位置。其中有如下两个公式:
    cpot[1] = 1
    cpot[col] = cpot[col - 1] + num[col - 1]

快速转置函数代码

void FastTranspose(TSMatrix M, TSMatrix &T) {
    T.mu = M.nu, T.nu = M.mu, T.tu = M.tu;
    if(T.tu) {
        int col, num[105], cpot[105];
        memset(num, 0, sizeof(num));
        memset(cpot, 0, sizeof(cpot));
        for(int i = 1; i <= M.tu; i++) num[M.data[i].j]++; // 每列的非零元个数
        cpot[1] = 1; // 第一行第一列的元素
        for(col = 2; col <= M.nu; col++) cpot[col] = num[col - 1] + cpot[col - 1]; // 每个非零元在新数组中的位置
        for(int p = 1; p <= M.tu; p++) {
            col = M.data[p].j;
            int q = cpot[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;
            cpot[col]++; // 切换到原矩阵的下一个非零元
        }
    }
}

即可直接得到有序的转置后新矩阵。
*需要注意for循环中临时变量的范围,容易写错。

标签:零元,转置,矩阵,稀疏,int,num,cpot
From: https://www.cnblogs.com/iszxh/p/17769752.html

相关文章

  • (五)Julia并行算法简介:矩阵乘法
    在本章中,我们将开始学习一系列专门讨论几种分布算法的设计、分析和实现的会议。这些算法经过精心挑选,以说明分布式内存方法的算法并行化的不同方面和潜在陷阱。本系列的第一部分研究矩阵乘法。学习目标在学习完本章节后,我们应该能够:在多个处理器上并行执行矩阵乘法通过复杂度......
  • 矩阵理论笔记1
    第一讲线性代数回顾定理和性质设\(A=(\alpha_{1},\alpha_{2},\alpha_{3},...,\alpha_{m})\),其中\(\alpha_{i}\)是一个n维列向量,那么有下面命题等价:1.1.\(b\inL(\alpha_{1},\alpha_{2},\alpha_{3},...,\alpha_{m})\),其中$L(\alpha_{1},\alpha_{2},\alpha_{3},...,\alpha_{......
  • LeetCode54. 螺旋矩阵Ⅰ
    题目描述给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例提交的代码classSolution{publicList<Integer>spiralOrder(int[][]matrix){//行数intm=matrix.length;//列数intn=matrix[0].......
  • 1277. 统计全为 1 的正方形子矩阵
    解法1:比较好理解的方式dp[i][j][k]:以(i,j)为右下角,长度为k的正方形是否满足全都为1,满足则为1,不满足则为0我们要做的就是对每个点判断一下它可能长度的正方形是不是以下几个条件:本身是否为1dp[i-1][j][k-1]是否为1dp[i][j-1][k-1]是否为1dp[i-1][j-......
  • LeetCode59. 螺旋矩阵Ⅱ
    题目描述给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例提交的代码classSolution{intmatrixLen=0;publicint[][]generateMatrix(intn){ //初始化空数组int[][]matrix=newint[n][......
  • 矩阵优化dp
    都快csps了,还什么都不会的菜鱼(我估计着马上就可以改了这句话了,成了都快noip了)矩阵我们要用矩阵优化dp,首先要知道矩阵是个什么东西(感觉其实可以不用知道)。矩阵的很多定义啥的都可以选择去oi-wiki上去进行学习。很简单的一堆定义。读者自学不难,这里就不多赘述。矩阵加法就是将......
  • OpenGL入门——矩阵变换与坐标系统
    一、OpenGL的数学库GLM向量和矩阵的运算就不作说明了,直接介绍OpenGL中如何使用矩阵变换。GLM(官网:OpenGLMathematics(g-truc.net))是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说只需包含对应的头文件就行了,不用链接和编译。把头文件的根目录复制到项目的includes......
  • 行列式与矩阵树定理
    定义定义矩阵的行列式:\[\detA=\sum_{\sigma}(-1)^{\tau(\sigma)}\prod_{i=1}^nA_{i\sigma_i}\]\(\tau(\sigma)\)是原排列的逆序对数。性质:若矩阵的某一行或某一列全为\(0\),则行列式为\(0\)。\(\detA=\detA^T\)。交换\(A\)的两行或两列,行列式取反。某一行或某一......
  • Transpose a data frame in R语言 转置
     #firstrememberthenamesn<-df.aree$name#transposeallbutthefirstcolumn(name)df.aree<-as.data.frame(t(df.aree[,-1]))colnames(df.aree)<-ndf.aree$myfactor<-factor(row.names(df.aree))str(df.aree)#CheckthecolumntypesR......
  • python_两两比较计算相似矩阵
    距离矩阵余弦距离矩阵余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异点集内或矩阵内两两元素之间的距离矩阵##简单使用两重循环defcompute_squared_EDM_method(X):#获得矩阵都行和列,因为是行向......