
这是我以前做过的一个程序,很经典的,应用一些数据结构的知识。
#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程序 ,有些高校有上数值线性代数的、多维数组之压缩对称矩阵等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)