matlab生成对称正定矩阵

matlab生成对称正定矩阵,第1张

恐怕要自己写程序,但有个粗略的思路:

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)

}


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

原文地址: https://www.outofmemory.cn/yw/11517146.html

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

发表评论

登录后才能评论

评论列表(0条)

保存