1.随机生成一个单位正交阵A(这个不困难,用到的只有for循环和函数rand)
2.随机生成一个对角元素均大于0的对角矩阵B(这个更容易了,就是生成几个随机正数而已)
3.C=A*B*A即为一个正定矩阵,同时也是一个对称矩阵。
#include <conio.h>#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 4
double A[N][N]={{68,-41,-17,10 },{-41,25 ,10 ,-6 },{-17, 10, 5, -3
},{10,-6,-3,2 }}
void swap(double *a,double *b){double cc= *a*a= *b*b= c}
int DinV(double A[N][N],int n)
{
int i,j,k
double d
int JS[N],IS[N]
for (k=0k<nk++)
{
d=0
for (i=ki<ni++)
for (j=kj<nj++){
if (fabs(A[i][j])>d){
d=fabs(A[i][j])
IS[k]=i
JS[k]=j
}// end if
}// end j
if (d+1.0==1.0) return 0
if (IS[k]!=k) for (j=0j<nj++) swap( &A[k][j], &A[IS[k]][j])
if (JS[k]!=k) for (i=0i<ni++) swap( &A[i][k], &A[i][JS[k]])
A[k][k]=1/A[k][k]
for (j=0j<nj++) if (j!=k) A[k][j]=A[k][j]*A[k][k]
for (i=0i<ni++) if (i!=k) for (j=0j<nj++) if (j!=k) A[i][j]=A[i][j]-A[i][k]*A[k][j]
for (i=0i<ni++) if (i!=k) A[i][k]=-A[i][k]*A[k][k]
} // for i
for (k=n-1k>=0k--)
{
for (j=0j<nj++) if (JS[k]!=k) swap( &A[k][j], &A[JS[k]][j])
for (i=0i<ni++) if (IS[k]!=k) swap( &A[i][k], &A[i][IS[k]])
} // for k
for (i=0i<ni++)
{
for (j=0j<nj++) printf(" %1.4f",A[i][j])
puts("")
} // for i
return 1
}
void main()
{
DinV(A,4)
getch()
}
这是我以前做过的一个程序,很经典的,应用一些数据结构的知识。#include <stdio.h>
#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
t.rows=Nt.cols=Nt.nums=0
for (i=0i<Ni++)
{
for(j=0j<Nj++)
{
if (A[i][j]!=0)
{
t.data[t.nums].r=i
t.data[t.nums].c=j
t.data[t.nums].d=A[i][j]
t.nums++
}
}
}
}
void DispMat(TSMatrix t)
{
printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums)
printf("\t-----------------\n")
for(int i=0i<t.numsi++)
{
printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d)
}
}
void TranMat(TSMatrix t,TSMatrix &tb)
{
int i,q=0,v
tb.cols=t.rows
tb.rows=t.cols
tb.nums=t.nums
if (t.nums!=0)
{
for(v=0v<t.colsv++)
for (i=0i<t.numsi++)
if(t.data[i].c==v)
{
tb.data[q].c=t.data[i].r
tb.data[q].r=t.data[i].c
tb.data[q].d=t.data[i].d
q++
}
}
}
int MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)
{
int i=0,j=0,k=0,v=0
if (a.cols!=b.cols||a.rows!=b.rows)
return 0
while (i<a.nums&&j<b.nums)
{
if (a.data[i].r==b.data[j].r)
{
if (a.data[i].c<b.data[j].c)
{
c.data[k].r=a.data[i].r
c.data[k].c=a.data[i].c
c.data[k].d=a.data[i].d
k++
i++
}
else if (a.data[i].c>b.data[j].c)
{
c.data[k].r=b.data[j].r
c.data[k].c=b.data[j].c
c.data[k].d=b.data[j].d
k++
j++
}
else
{
v=a.data[i].d+b.data[j].d
if (v!=0)
{
c.data[k].r=a.data[i].r
c.data[k].c=a.data[i].c
c.data[k].d=v
k++
}
i++
j++
}
}
else if(a.data[i].r>b.data[j].r)
{
c.data[k].r=b.data[j].r
c.data[k].c=b.data[j].c
c.data[k].d=b.data[j].d
k++
j++
}
else
{
c.data[k].r=a.data[i].r
c.data[k].c=a.data[i].c
c.data[k].d=a.data[i].d
k++
i++
}
c.nums=k
}
return 1
}
int Vaul(TSMatrix c,int i,int j)
{
int k=0
while(k<c.nums&&(c.data[k].r!=i||c.data[k].c!=j))
k++
if (k<c.nums)
{
return c.data[k].d
}
else
return 0
}
int MatMul(TSMatrix a,TSMatrix b,TSMatrix &c)
{
int i,j,k,p=0
ElemType s
if (a.cols!=b.rows)
{
return 0
}
for (i=0i<a.rowsi++)
{
for (j=0j<b.colsj++)
{
s=0
for (k=0k<a.colsk++)
{
s+=Vaul(a,i,k)*Vaul(b,k,j)
}
if (s!=0)
{
c.data[p].r=i
c.data[p].c=j
c.data[p].d=s
p++
}
}
}
c.rows=a.rows
c.cols=b.cols
c.nums=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=a*b:\n")
MatMul(a,b,c)
printf(" c的三元数组:\n")DispMat(c)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)