C++编程求任意对称正定矩阵的逆

C++编程求任意对称正定矩阵的逆,第1张

这是我以前做过的一个程序,很经典的,应用一些数据结构的知识。

#include <stdioh>

#define N 4

#define MaxSize 100

typedef int ElemType;

typedef struct

{

int r;

int c;

ElemType d;

}TupNode;

typedef struct

{

int rows;

int cols;

int nums;

TupNode data[MaxSize];

}TSMatrix;

void CreatMat(TSMatrix &t,ElemType A[][N])

{

int i,j;

trows=N;tcols=N;tnums=0;

for (i=0;i<N;i++)

{

for(j=0;j<N;j++)

{

if (A[i][j]!=0)

{

tdata[tnums]r=i;

tdata[tnums]c=j;

tdata[tnums]d=A[i][j];

tnums++;

}

}

}

}

void DispMat(TSMatrix t)

{

printf("\t%d\t%d\t%d\n",trows,tcols,tnums);

printf("\t-----------------\n");

for(int i=0;i<tnums;i++)

{

printf("\t%d\t%d\t%d\n",tdata[i]r,tdata[i]c,tdata[i]d);

}

}

void TranMat(TSMatrix t,TSMatrix &tb)

{

int i,q=0,v;

tbcols=trows;

tbrows=tcols;

tbnums=tnums;

if (tnums!=0)

{

for(v=0;v<tcols;v++)

for (i=0;i<tnums;i++)

if(tdata[i]c==v)

{

tbdata[q]c=tdata[i]r;

tbdata[q]r=tdata[i]c;

tbdata[q]d=tdata[i]d;

q++;

}

}

}

int MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)

{

int i=0,j=0,k=0,v=0;

if (acols!=bcols||arows!=brows)

return 0;

while (i<anums&&j<bnums)

{

if (adata[i]r==bdata[j]r)

{

if (adata[i]c<bdata[j]c)

{

cdata[k]r=adata[i]r;

cdata[k]c=adata[i]c;

cdata[k]d=adata[i]d;

k++;

i++;

}

else if (adata[i]c>bdata[j]c)

{

cdata[k]r=bdata[j]r;

cdata[k]c=bdata[j]c;

cdata[k]d=bdata[j]d;

k++;

j++;

}

else

{

v=adata[i]d+bdata[j]d;

if (v!=0)

{

cdata[k]r=adata[i]r;

cdata[k]c=adata[i]c;

cdata[k]d=v;

k++;

}

i++;

j++;

}

}

else if(adata[i]r>bdata[j]r)

{

cdata[k]r=bdata[j]r;

cdata[k]c=bdata[j]c;

cdata[k]d=bdata[j]d;

k++;

j++;

}

else

{

cdata[k]r=adata[i]r;

cdata[k]c=adata[i]c;

cdata[k]d=adata[i]d;

k++;

i++;

}

cnums=k;

}

return 1;

}

int Vaul(TSMatrix c,int i,int j)

{

int k=0;

while(k<cnums&&(cdata[k]r!=i||cdata[k]c!=j))

k++;

if (k<cnums)

{

return cdata[k]d;

}

else

return 0;

}

int MatMul(TSMatrix a,TSMatrix b,TSMatrix &c)

{

int i,j,k,p=0;

ElemType s;

if (acols!=brows)

{

return 0;

}

for (i=0;i<arows;i++)

{

for (j=0;j<bcols;j++)

{

s=0;

for (k=0;k<acols;k++)

{

s+=Vaul(a,i,k)Vaul(b,k,j);

}

if (s!=0)

{

cdata[p]r=i;

cdata[p]c=j;

cdata[p]d=s;

p++;

}

}

}

crows=arows;

ccols=bcols;

cnums=p;

return 1;

}

void main()

{

ElemType A[N][N]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};

ElemType B[N][N]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};

TSMatrix a,b,c;

CreatMat(a,A);

CreatMat(b,B);

printf("(1)a的三元数组:\n");DispMat(a);

printf("(2)b的三元数组:\n");DispMat(b);

printf("(3)a的转置为c:\n");

TranMat(a,c);

printf(" c的三元数组:\n");DispMat(c);

printf("(5)c=a+b:\n");

MatAdd(a,b,c);

printf(" c的三元数组:\n");DispMat(c);

printf("(6)c=ab:\n");

MatMul(a,b,c);

printf(" c的三元数组:\n");DispMat(c);

}

%对称三对角矩阵特征值的二分法

program ex0001 integer n

real x1,x2,x,f1,f2,fx,eps

real,allocatable::d(,e(

write(,) "Please enter n:" read(,) n

allocate(d(n),e(n-1)) eps=10E-6 fx=10 do j=1,n d(j)=-2 end do do j=1,n-1 e(j)=1 end do

!write(,) "Please enter array d and e:" !read(,) d,e a1=d(1)-e(1) a2=d(1)-2e(1) a3=d(1)+e(1) a4=d(1)+2e(2) y1=min(a1,a2)

- 2 -

y2=max(a4,a3) y=(y2-y1)/n x1=y1 x2=y1+y

write(,)"矩阵的特征值为:" do m=1,n temp=x2

10 if(abs(fx)>eps) then x=(x1+x2)/2

f1=MValue(x1,n,d,e) f2=MValue(x2,n,d,e) fx=MValue(x,n,d,e)

if (fxf1>0) then x1=x else x2=x end if

go to 10 end if

print,"--------------------" write(,) x x1=temp x2=temp+y z=(x1+x2)/2

fx=MValue(z,n,d,e) end do

print,"--------------------"

contains

real function mValue(x,n,d,e) Integer n,i real x

real d(n),e(n-1),s(n) S(1)=x-d(1)

S(2)=(x-d(1))(x-d(2))-e(1)2

- 3 -

Do i=3,n

S(i)=(x-d(i))s(i-1)-e(i-1)2s(i-2) End do

mValue=s(n) return

End function mValue

end

这是程序,没排版的,自己排吧,绝对能用

接近4M数据,压缩到2M左右即可满足不超过4M内存保存。

因为是对称矩阵,只需要保存左下这个三角形中的数据即可。

也就是说对于nn的矩阵需要的数组大小是(1+n)n/2

索引的时候位置(i, j)的数保存在a[(1+i)i/2 + j]里面(i >= j)。

程序如下:

#include <iostream>

using namespace std;

int main()

{

int n;

cin >> n;

int a = new int[(1+n)n/2];

for(int i=0; i<n; i++)

{

for(int j=0; j<=i; j++) cin >> a[(1+i)i/2 + j];

int t;

for(int j=i+1; j<n; j++) cin >> t;

}

int m;

cin >> m;

for(int i=0; i<m; i++)

{

int x, y;

cin >> x >> y;

x = x - 1;

y = y - 1;

if(x < y)

{

int t = x;

x = y;

y = t;

}

cout << a[(1+x)x/2 + y] << endl;

}

delete a;

return 0;

}

对称矩阵是针对方阵(行列相等)而言,对任意的方阵A,A+A的转置 一定是对称的。

以下是任意矩阵转置的c语言代码 不知对你有没用。

#include<stdioh>

int main()

{ int i,j,k,m,n;

double temp,a[100][100],b[100][100];

printf("a[m][n]==>input m(行):\n");

scanf("%d",&m);

printf("a[m][n]==>input n(列):\n");

scanf("%d",&n);

printf("input a[%d][%d]:\n",m,n);

for(i=0;i<m;i++)

for(j=0;j<n;j++)

scanf("%lf",&a[i][j]);

for(i=0;i<m;i++)

for(j=0;j<n;j++)

{b[j][i]=a[i][j];

}

printf("转置后,result==>:\n");

for(i=0;i<n;i++)

{for(j=0;j<m;j++)

printf("%lf ",b[i][j]);

printf("\n");

}

return 0;

}

最近也用到呢,网上下的代码,未经验证,给你参考一下吧

//雅可比法求实对称矩阵的特征值与特征向量

void Jacobi(int n,float (a)[7][7],float (s)[8][8]) //n为矩阵阶数,a为输入矩阵,s为输出矩阵

{

int i,j,i1,l,iq,iql,ip;

float g,s1,s2,s3,v1,v2,v3,u,st,ct;

for(i=0;i<=n;i++)

{

for(j=0;j<=i;j++)

{

if((i-j)==0)

(s)[i][j]=1;

else

{

(s)[i][j]=00;

(s)[j][i]=00;

}

}

}

g=0;

for(i=1;i<n;i++)

{

i1=i-1;

for(j=0;j<=i1;j++)

g=g+2(a)[i][j](a)[i][j];

}

s1=sqrt(g);

s2=min/(n)s1;

s3=s1;

do

{

s3=s3/(n);

do

{

l=0;

for(iq=1;iq<n;iq++)

{

iql=iq-1;

for(ip=0;ip<=iql;ip++)

{

if(fabs((a)[ip][iq])>=s3)

{

l=1;

v1=(a)[ip][ip];

v2=(a)[ip][iq];

v3=(a)[iq][iq];

u=05(v1-v3);

if(u==0)

g=1;

if(fabs(u)>=1e-10)

g=-(u/fabs(u)l)v2/sqrt(v2v2+uu);

st=g/sqrt(2(l+sqrt(l-gg)));

ct=sqrt(1-stst);

for(i=0;i<n;i++)

{

g=(a)[i][ip]ct-(a)[i][iq]st;

(a)[i][iq]=(a)[i][ip]st+(a)[i][iq]ct;

(a)[i][ip]=g;

g=(s)[i][ip]ct-(s)[i][iq]st;

(s)[i][iq]=(s)[i][ip]st+(s)[i][iq]ct;

(s)[i][ip]=g;

}

for(i=0;i<n;i++)

{

(a)[ip][i]=(a)[i][ip];

(a)[iq][i]=(a)[i][iq];

}

g=2v2stct;

(a)[ip][ip]=v1ctct+v3stst-g;

(a)[iq][iq]=v1stst+v3ctct+g;

(a)[ip][iq]=(v1-v3)stct+v2(ctct-stst);

(a)[iq][ip]=(a)[ip][iq];

}

}

}

}while(l==1);

}while(s3>s2);

}

#include <stdioh>

#define N 5

void main()

{

int i,j,t,a[N][N];

for(i=0;i<N;i++)

for(j=0;j<N;j++)

scanf("%d",&a[i][j]);

for(i=0;i<N;i++)

for(j=i+1;j<N;j++)

{t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}

printf("\n");

for(i=0;i<N;i++)

{

for(j=0;j<N;j++)

printf("%d ",a[i][j]);

printf("\n");

}

}

以上就是关于C++编程求任意对称正定矩阵的逆全部的内容,包括:C++编程求任意对称正定矩阵的逆、求三对称矩阵特征值 用二分法来解的matlab程序 ,有些高校有上数值线性代数的、多维数组之压缩对称矩阵等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10215501.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存