矩阵的转置
2012-06-30 22:51
211 查看
矩阵的压缩存储:为多个值相同的元素只分配一个存储空间,对零元素不分配空间可以节省存储空间,压缩存储矩阵并使矩阵的运算有效的进行
可压缩矩阵可分为两大类
特殊矩阵:值相同的元素或零元素在矩阵中分布有一定规律。如三角矩阵、对角矩阵
随机稀疏矩阵:值相同的元素或零元素在矩阵中分布没有一定规律
当对某一矩阵进行运算时首先想到的是用数组对矩阵的数据进行储存所以知道数组中任意元素地址是必须的操作
计算数组任一元地址需要的三要素:数组的起始地址(即基址)、数组维数和各维的长度、数组中每个元素所占的存储单元,如以行主序为主则该元素地址为数组的起始地址+(数组的列长*该元素的行坐标+该元素的列坐标)*数组中每个元素所占的存储单元,如以列为主则该元素地址为数组的起始地址+(数组的行长*该元素的列坐标+该元素的行坐标)*数组中每个元素所占的存储单元
矩阵转置的基本过程是利用数组储存一个矩阵所含的的数据,利用矩阵的压缩存储构造一个三元表即遍历整个数组将非零元所处的行、列位置储存到三元表中并将其值储存,然后就是对三元表进行操作,将三元表中的非零元的行与列坐标互换生成一个新的三元表,根据新三元表数据将其还原成数组,使其与原来的数组互为转置。
三元表数据结构:typedef struct
{
int i,j;储存数组元素的行列位置值
int e;//储存数组元素的值
}Sy;
typedef struct
{
Sy a[max];
int mu,nu,tu;//数组的行、列值及非零元个数
}Syzu;
创建三元表函数
利用指针获得数组的首地址对数组进行遍历储存非零元的行、列位置值及该位置数组元素的值,储存数组的维数。
void creat(Syzu &S,int *p,int m,int n)
{
S.mu=m;
S.nu=n;
S.tu=0;
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(*p!=0)
{
S.a[S.tu].e=*p;
S.a[S.tu].i=i;
S.a[S.tu].j=j;
S.tu++;
}
p++;
}
}
}
对三元表中的数据进行操作将其储存的行列值互换得到新的三元表
void change(Syzu S,Syzu &T)
{
T.mu=S.nu;
T.nu=S.mu;
T.tu=0;
int i;
int l;
for(i=0;i<S.tu;i++)
{
for(l=0;l<S.nu;l++)
{
if(S.a[i].j==l)
{
T.a[T.tu].i=l;
T.a[T.tu].j=S.a[i].i;
T.a[T.tu].e=S.a[i].e;
T.tu++;
}
}
}
}
利用新生成的三元表数据还原数组即生成转置矩阵,利用指针获得数组的首地址并将其值返回给数组
void recreat(Syzu S,int *p)
{
int i;
for(i=0;i<S.tu;i++)
{
*(p+S.a[i].i*S.nu+S.a[i].j)=S.a[i].e;
}
}
可压缩矩阵可分为两大类
特殊矩阵:值相同的元素或零元素在矩阵中分布有一定规律。如三角矩阵、对角矩阵
随机稀疏矩阵:值相同的元素或零元素在矩阵中分布没有一定规律
当对某一矩阵进行运算时首先想到的是用数组对矩阵的数据进行储存所以知道数组中任意元素地址是必须的操作
计算数组任一元地址需要的三要素:数组的起始地址(即基址)、数组维数和各维的长度、数组中每个元素所占的存储单元,如以行主序为主则该元素地址为数组的起始地址+(数组的列长*该元素的行坐标+该元素的列坐标)*数组中每个元素所占的存储单元,如以列为主则该元素地址为数组的起始地址+(数组的行长*该元素的列坐标+该元素的行坐标)*数组中每个元素所占的存储单元
矩阵转置的基本过程是利用数组储存一个矩阵所含的的数据,利用矩阵的压缩存储构造一个三元表即遍历整个数组将非零元所处的行、列位置储存到三元表中并将其值储存,然后就是对三元表进行操作,将三元表中的非零元的行与列坐标互换生成一个新的三元表,根据新三元表数据将其还原成数组,使其与原来的数组互为转置。
三元表数据结构:typedef struct
{
int i,j;储存数组元素的行列位置值
int e;//储存数组元素的值
}Sy;
typedef struct
{
Sy a[max];
int mu,nu,tu;//数组的行、列值及非零元个数
}Syzu;
创建三元表函数
利用指针获得数组的首地址对数组进行遍历储存非零元的行、列位置值及该位置数组元素的值,储存数组的维数。
void creat(Syzu &S,int *p,int m,int n)
{
S.mu=m;
S.nu=n;
S.tu=0;
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(*p!=0)
{
S.a[S.tu].e=*p;
S.a[S.tu].i=i;
S.a[S.tu].j=j;
S.tu++;
}
p++;
}
}
}
对三元表中的数据进行操作将其储存的行列值互换得到新的三元表
void change(Syzu S,Syzu &T)
{
T.mu=S.nu;
T.nu=S.mu;
T.tu=0;
int i;
int l;
for(i=0;i<S.tu;i++)
{
for(l=0;l<S.nu;l++)
{
if(S.a[i].j==l)
{
T.a[T.tu].i=l;
T.a[T.tu].j=S.a[i].i;
T.a[T.tu].e=S.a[i].e;
T.tu++;
}
}
}
}
利用新生成的三元表数据还原数组即生成转置矩阵,利用指针获得数组的首地址并将其值返回给数组
void recreat(Syzu S,int *p)
{
int i;
for(i=0;i<S.tu;i++)
{
*(p+S.a[i].i*S.nu+S.a[i].j)=S.a[i].e;
}
}
相关文章推荐
- 矩阵的转置---(C语言)
- SDUTACM 数据结构实验之数组一:矩阵转置
- 8.9 写一函数,将一个3X3的整型矩阵转置。
- 为什么转置一个512x512的矩阵,会比513x513的矩阵慢很多?
- 为什么转置512×512矩阵,会比513×513矩阵慢很多?
- C语言:n维矩阵转置
- XYNU OJ 1102: 例题6-4 矩阵转置
- 矩阵原地转置算法
- 稀疏矩阵的转置
- c++数组-矩阵的转置
- 将3*3的矩阵转置【指针】
- 指针实现矩阵转置
- HNUST 1411 矩阵转置
- O(1)空间内实现矩阵转置
- C语言学习之用二维数组实现矩阵转置
- 第5章 数组和广义表——矩阵的转置
- 稀疏矩阵的转置与快速转置
- 稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法
- python 矩阵转置transpose--实战应用详解
- 稀疏矩阵的压缩存储及快速转置