压缩矩阵之转置

#ifndef _MASTRIX_H_
#define _MASTRIX_H_
#define OK 1
#define ERROR 0
#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;
void Init(TSMatrix &M);
void Print(TSMatrix M);
int TransposeSMatrix(TSMatrix M,TSMatrix &T);
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T);
#endif

#include"Matrix.h"
#include<iostream>
#include<iomanip>
using namespace std;
//构造矩阵
void Init(TSMatrix &M)
{
 int p;//非零元个数
 cout<<"请输入矩阵的行数、列数、非零元的个数"<<endl;
 cin>>M.mu>>M.nu>>M.tu;//输入矩阵的行数、列数、非零元的个数
 for(p=1;p<=M.tu;p++)
 {
  cin>>M.data[p].i>>M.data[p].j>>M.data[p].e;
 }
}
//遍历
void Print(TSMatrix M)
{
 int k=1,i,j;
 for(i=1;i<=M.mu;i++)
 {
  for(j=1;j<=M.nu;j++)
  {
   if(i==M.data[k].i&&j==M.data[k].j&&k<=M.tu)
   {
    cout<<setw(3)<<M.data[k].e;
    k++;
   }
   else
   {
    cout<<setw(3)<<'0';
   }
  
  }
  cout<<endl;
 }
 /*for(k=1;k<=M.tu;k++)
 {
  cout<<M.data[k].i<<setw(3)<<M.data[k].j<<setw(3)<<M.data[k].e<<endl;
 }
 cout<<endl;*/
}
//按列转置
int TransposeSMatrix(TSMatrix M,TSMatrix &T)
{
 int col,p,q;
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 if(T.tu)
 {
  q=1;
  for(col=1;col<=M.nu;col++)
  {
   for(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 OK;
}
//快速转置
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
 int copt[20],num[20];
 int col,p,q,t;
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 if(T.tu)
 {
  for(col=1;col<=M.nu;col++)
  {
   num[col]=0;
  }
  for(t=1;t<=M.tu;t++)//非零元的个数
  {
   ++num[M.data[t].j];
  }
  copt[1]=1;
  for(col=2;col<=M.nu;col++)
  {
   copt[col]=copt[col-1]+num[col-1];
  }
  for(p=1;p<=M.tu;p++)
  {
   col=M.data[p].j;
   q=copt[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;
   ++copt[col];
  }
 }
 return OK;
}


#include"Matrix.h"
#include<iostream>
using namespace std;
int main()
{
 TSMatrix M,T;
 int select;
 Init(M);
 do
 {
  cout<<"1.转置之前遍历!"<<endl;
  cout<<"2.按列转置!"<<endl;
  cout<<"3.快速转置!"<<endl;
  cout<<"0.操作结束!"<<endl;
  cout<<"请选择:"<<endl;
  cin>>select;
  switch(select)
  {
  case 1:Print(M);
   break;
  case 2:
   if(TransposeSMatrix( M,T)==OK)
   {
    Print(T);
   }
   else
   {
    cout<<"转置出错!"<<endl;
   }
   break;
  case 3:
   if(FastTransposeSMatrix( M,T)==OK)
   {
    Print(T);
   }
   else
   {
    cout<<"转置出错!"<<endl;
   }
   break;
  case 0:
   cout<<"操作结束!"<<endl;
   break;
  default:
   cout<<"输入错误!"<<endl;
  }
 }while(select!=0);
 return 0;
}

### 压缩矩阵转置运算 #### 使用三元组表实现压缩矩阵及其转置 为了有效地处理稀疏矩阵,可以采用三元组表来表示这种矩阵。三元组表中的每一项记录了非零元素的位置(行号、列号)及其值。这种方式不仅节省空间,而且便于执行某些特定的操作,比如转置。 在进行压缩矩阵转置时,主要目标是从原始的三元组列表出发构建一个新的三元组列表,在新列表里原来的行索引变为列索引而原来列索引则成为新的行索引[^3]。 下面展示了一个简单的Java程序用于创建并打印一个基于三元组形式存储的稀疏矩阵,并对其进行转置: ```java import java.util.ArrayList; import java.util.List; class SparseMatrix { int rows, cols; // 行数和列数 List<Triple> triples = new ArrayList<>(); // 非零元素组成的三元组链表 static class Triple { // 定义三元组类 int row, col, value; public Triple(int r, int c, int v){ this.row=r; this.col=c; this.value=v; } } void addElement(int i, int j, int val){ // 添加非零元素到三元组中 if(val != 0) triples.add(new Triple(i,j,val)); } void display(){ // 显示原矩阵 System.out.println("Original Matrix:"); for (int i=0;i<rows;++i){ for (int j=0;j<cols;++j){ boolean found=false; for(Triple t : triples){ if(t.row==i && t.col==j){ System.out.print(t.value+" "); found=true;break;} }if(!found)System.out.print(0+" "); }System.out.println(); } } SparseMatrix transpose(){ // 转置函数 SparseMatrix transposedMat=new SparseMatrix(); transposedMat.rows=this.cols; transposedMat.cols=this.rows; for(Triple triple:this.triples){ transposedMat.addElement(triple.col,triple.row,triple.value); } return transposedMat; } } public class Main{ public static void main(String[] args){ SparseMatrix mat=new SparseMatrix(); mat.rows=4; mat.cols=5; mat.addElement(0,1,2);mat.addElement(1,2,-3);mat.addElement(3,0,4); mat.display(); SparseMatrix Tmatrix=mat.transpose(); System.out.println("\nTransposed Matrix:"); Tmatrix.display(); } } ``` 上述代码实现了基本的功能需求:定义了`SparseMatrix`类来保存稀疏矩阵的信息;提供了向其中加入非零元素的方法;能够输出整个矩阵的样子;最重要的是包含了完成矩阵转置的核心逻辑——遍历现有的三元组并将它们重新组织成适合于表达转置后的矩阵的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值