稀疏矩阵转置 java代码_三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)...

三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的。快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部分,时间复杂度为O(nu+tu);个人认为重排三元组之间的次序一步可以省略,虽然三元组数据变得杂乱无章,但是可以把时间复杂度提高到O(tu),如果是不考虑三元组,直接输出转置后的矩阵就可以采用这种方法;行逻辑链接实现稀疏矩阵相乘,十字链表实现稀疏矩阵相加正在编写中,即将更新。声明:转载,引用请以链接形式指明出处。

三元组类Triple.java

package 稀疏矩阵的运算;

public class Triple {

int row,col;

T v;

public Triple(){}

public Triple(int row,int col, T v){

this.row = row;

this.col = col;

this.v = v;

}

}

稀疏矩阵类Mat.java

package 稀疏矩阵的运算;

public class Mat {

final int MAXSIZE = 10;

int mu,nu,tu;

Triple data[] = new Triple[MAXSIZE + 1];//Java不支持泛型数组

public Mat(int mu,int nu,int tu){

this.mu = mu;

this.nu = nu;

this.tu = tu;

for(int i=1; i<=MAXSIZE; i++)

data[i] = new Triple();

}

public void display(){

int i,j,k,m,n,count = 0;

for(i=1; i<=mu; i++){

for(j=1; j<=nu; j++){

for(k=1; k<=tu; k++){

if(i==data[k].row && j==data[k].col){

System.out.print(data[k].v + " ");

count = -1;

break;

}

}

if(count != -1)

System.out.print("0 ");

count = 0;

}

System.out.println();

}

}

}

快速转置Transfer.java

package 稀疏矩阵的运算;

import java.util.*;

public class Transfer {

public static void main(String[] args) {

int i,j,k,l;

Scanner scan = new Scanner(System.in);

System.out.println("请输入矩阵的行数,列数,非零元的个数:");

int mu,nu,tu;

mu = scan.nextInt();

nu = scan.nextInt();

tu = scan.nextInt();

Mat M1 = new Mat(mu,nu,tu);

Mat M2 = new Mat(nu,mu,tu);

System.out.println("请输入矩阵的三元组:");

for(i=1; i<=tu; i++){

M1.data[i].row = scan.nextInt();

M1.data[i].col = scan.nextInt();

M1.data[i].v = scan.nextInt();

}

System.out.println("您输入的矩阵为:");

M1.display();

//增加两个向量

int num[] = new int[nu+1];//M1中第col列中非零元的个数

int col,row,t;

for(col=1; col<=nu; col++){

num[col] = 0;

}

for(t=1; t<=tu; t++){

num[M1.data[t].col]++;

}

int cpot[] = new int[nu+1];//M1中第col列的第一个非零元在M2.data中的位置。

cpot[1] = 1;

for(col=2; col<=nu; col++){

cpot[col] = cpot[col - 1] + num[col - 1];

}

int p,q;//实现转置

for(p=1; p<=tu; p++){

col = M1.data[p].col;

q = cpot[col];

M2.data[q].row = M1.data[p].col;

M2.data[q].col = M1.data[p].row;

M2.data[q].v = M1.data[p].v;

cpot[col]++;

}

System.out.println("转置后的矩阵为:");

M2.display();

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值