矩阵的转置

来源:互联网 发布:装修预算计算器 源码 编辑:程序博客网 时间:2024/05/17 22:01

          矩阵的压缩存储:为多个值相同的元素只分配一个存储空间,对零元素不分配空间可以节省存储空间,压缩存储矩阵并使矩阵的运算有效的进行

         可压缩矩阵可分为两大类

         特殊矩阵:值相同的元素或零元素在矩阵中分布有一定规律。如三角矩阵、对角矩阵

         随机稀疏矩阵:值相同的元素或零元素在矩阵中分布没有一定规律

        当对某一矩阵进行运算时首先想到的是用数组对矩阵的数据进行储存所以知道数组中任意元素地址是必须的操作

        计算数组任一元地址需要的三要素:数组的起始地址(即基址)、数组维数和各维的长度、数组中每个元素所占的存储单元,如以行主序为主则该元素地址为数组的起始地址+(数组的列长*该元素的行坐标+该元素的列坐标)*数组中每个元素所占的存储单元,如以列为主则该元素地址为数组的起始地址+(数组的行长*该元素的列坐标+该元素的行坐标)*数组中每个元素所占的存储单元

      矩阵转置的基本过程是利用数组储存一个矩阵所含的的数据,利用矩阵的压缩存储构造一个三元表即遍历整个数组将非零元所处的行、列位置储存到三元表中并将其值储存,然后就是对三元表进行操作,将三元表中的非零元的行与列坐标互换生成一个新的三元表,根据新三元表数据将其还原成数组,使其与原来的数组互为转置。

    三元表数据结构: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;
}

}

原创粉丝点击