矩阵的压缩记忆域:对相同值的多个要素只分配一个记忆域,对零要素不分配领域,从而节约记忆域,可以压缩记忆域矩阵,高效地进行矩阵的运算
可压缩矩阵大致分为两类
特殊矩阵:值相同的元素或零元素在矩阵中具有一定的规律性分布。 例如三角矩阵、对角矩阵
稀疏矩阵:值相同的要素或零要素在矩阵内没有一定规则的分布
运算某个矩阵时,首先考虑用数组保存矩阵的数据,所以知道数组中任意元素的地址是必须的操作
计算数组的任意元地址所需的3个要素是数组的起始地址,即基本地址、数组维数和各维的长度、数组内的各要素所占的存储单元,在行的主顺序为主时,其要素地址是数组的起始地址(数组的列长)
矩阵转置的基本过程是利用矩阵存储矩阵中包含的数据,利用矩阵的压缩记忆建立三元表。 也就是说,横穿整个排列,将非零元所在的行、列的位置保存在三元表中,并保存其值。 然后,对三元表进行操作,调换三元表中非零元的行和列的坐标,生成新的三元表,根据新的三元表数据复原为数组,与原数组相互转置。
三元表数据结构: typedef struct
{
int i,j; 存储数组元素的矩阵位置的值
int e; //保存数组元素的值
(sy;
typedef struct
{
Sy a[max];
int mu、nu、tu; //数组的行、列值和非零原始数量
}Syzu;
构造三元表函数
使用指针获取数组的起始地址,存储用于遍历数组和存储非零元素的行、列位置值以及该位置数组元素的值,并存储数组的维数。
voidcreat(syzus,int *p,int m,int n ) )。
{
S.mu=m;
S.nu=n;
S.tu=0;
int i,j;
for(I=0; iM; I )
{
for(j=0; jN; 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;
}
}
}
操作三元表中的数据,替换保存的矩阵值,得到新的三元表
voidchange(syzus,Syzu T ) )。
{
T.mu=S.nu;
T.nu=S.mu;
T.tu=0;
int i;
int l;
for(I=0; iS.tu; I )
{
for(L=0; lS.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;
}
}
}
}
使用新生成的三元表数据复原数组后,生成转置矩阵,使用指针取得数组的起始地址,将其值返回数组
voidrecreat(syzus,int *p ) ) ) ) ) ) ) ) ) ) ) voidrecreat(syzus,int *p ) )
{
int i;
for(I=0; iS.tu; I )
{
*(ps.a[I].I*s.nus.a[I].j )=S.a[i].e;
}
}