首页 > 编程知识 正文

A乘A的转置等于E,矩阵转置×原矩阵是什么

时间:2023-05-05 06:36:29 阅读:149331 作者:565

矩阵的压缩记忆域:对相同值的多个要素只分配一个记忆域,对零要素不分配领域,从而节约记忆域,可以压缩记忆域矩阵,高效地进行矩阵的运算

可压缩矩阵大致分为两类

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

稀疏矩阵:值相同的要素或零要素在矩阵内没有一定规则的分布

运算某个矩阵时,首先考虑用数组保存矩阵的数据,所以知道数组中任意元素的地址是必须的操作

计算数组的任意元地址所需的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;

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。