matlab lltsa函数,带平方根的(LLT)Cholesky算法分解对称正定矩阵 c语言实现 - 数学 - 小木虫 - 学术 科研 互动社区...

0a23c9cbf3c8f9c9607fb4f1f99b8c6b.gif

xiuyouxu

建议找一本数值分析的书看一下,里面有具体的算法,我以前实现过,其他语言的,没有用c语言做过.

5a9cf3e94de0c652e426013c24ee228c.png

舒马诺

引用回帖:

xiuyouxu at 2012-05-03 21:28:11:

建议找一本数值分析的书看一下,里面有具体的算法,我以前实现过,其他语言的,没有用c语言做过.

# include

# include

void main()

{

float m,A[9];

float L[6];

printf("璇疯緭鍏ョ煩闃�: \n ");

scanf("%f %f %f\n%f %f %f\n%f %f %f\n",&A[0],&A[1],&A[2],&A[3],&A[4],&A[5],&A[6],&A[7],&A[8]);

printf("璇疯緭鍏ュ�?璁歌宸�:m=");

scanf("%f",&m);

if

A[0]>m&&(A[0]*A[4]-A[1]*A[3]>m)&&(A[6]*A[4]*A[2]+A[0]*A[7]*A[5]+A[1]*A[3]*A[8]-A[0]*A[4]*A[8]-A[1]*A[6]*A[5]-A[2]*A[3]*A[7]>m)&&(A[1]==A[3])&&(A[2]==A[6])&&(A[5]==A[7])

{

L[0]=sqrt(A[0]);

L[1]=A[3]/L[0];

L[3]=A[6]/L[0];

L[2]=sqrt(A[4]-L[1]*L[1]);

L[4]=(A[7]-L[3]*L[1])/L[2];

L[5]=sqrt(A[8]-L[3]*L[3]-L[4]*L[4]);

printf("鎵�姹傜煩闃典负L=\n %f 0 0\n%f %f 0\n%f %f %f\n",L[0],L[1],L[2],L[3],L[4], L[5]);

}

else

printf("杈撳叆鏈夎锛岃妫�鏌�");

}

璋冭瘯杩?琛岋細

1>.\Debug\shiyan.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. {_~0p'1a@'7v par 1>Build log was saved at "file://e:\360data\閲?瑕?鏁版?甛妗岄?shiyan\shiyan\Debug\BuildLog.htm"

1>shiyan - 1 error(s), 0 warning(s)

========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

宸ョ▼鏃犳硶寤虹珛

棰勬湡鏁堟灉锛�

璇疯緭鍏ョ煩闃碉細

1 2 3

2 4 5

3 5 6

璇疯緭鍏ュ�?璁歌宸細m=1e-6

杈撳叆鏈夎锛岃妫�鏌�

璇疯緭鍏ョ煩闃碉細

5 2 -4

2 1 -2

-4 -2 5

璇疯緭鍏ュ�?璁歌宸細m=1e-6

鎵�姹傜煩闃礚=

2.236068 0 0

0.894427 0.4472136 0

-1.788854 -0.894427 1

鎴戠殑绠楁硶杩?琛屼�?閫氳繃鍟婏紝鑰屼笖鏍规湰鏈兘瀹炵幇閽堝浠绘�?闃舵鐨勭煩闃点�傘�傘�傛眰澶х甯繖~

5a9cf3e94de0c652e426013c24ee228c.png

舒马诺

引用回帖:

xiuyouxu at 2012-05-03 21:28:11:

建议找一本数值分析的书看一下,里面有具体的算法,我以前实现过,其他语言的,没有用c语言做过.

# include

# include

void main()

{

float m,A[9];

float L[6];

printf("请输入矩阵: \n ");

scanf("%f %f %f\n%f %f %f\n%f %f %f\n",&A[0],&A[1],&A[2],&A[3],&A[4],&A[5],&A[6],&A[7],&A[8]);

printf("请输入允许误差:m=");

scanf("%f",&m);

if

A[0]>m&&(A[0]*A[4]-A[1]*A[3]>m)&&(A[6]*A[4]*A[2]+A[0]*A[7]*A[5]+A[1]*A[3]*A[8]-A[0]*A[4]*A[8]-A[1]*A[6]*A[5]-A[2]*A[3]*A[7]>m)&&(A[1]==A[3])&&(A[2]==A[6])&&(A[5]==A[7])

{

L[0]=sqrt(A[0]);

L[1]=A[3]/L[0];

L[3]=A[6]/L[0];

L[2]=sqrt(A[4]-L[1]*L[1]);

L[4]=(A[7]-L[3]*L[1])/L[2];

L[5]=sqrt(A[8]-L[3]*L[3]-L[4]*L[4]);

printf("所求矩阵为L=\n %f 0 0\n%f %f 0\n%f %f %f\n",L[0],L[1],L[2],L[3],L[4], L[5]);

}

else

printf("输入有误,请检查");

}

调试运行:

1>.\Debug\shiyan.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. {_~0p'1a@'7v par 1>Build log was saved at "file://e:\360data\重要数据\桌面\shiyan\shiyan\Debug\BuildLog.htm"

1>shiyan - 1 error(s), 0 warning(s)

========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

工程无法建立

失败了,而且达不到针对任意阶次矩阵的效果!

0a23c9cbf3c8f9c9607fb4f1f99b8c6b.gif

xiuyouxu

matlab里面直接用root函数就可以了, 下面是我写的c++的:

// 定义Matrix类(略)

// m*n阶0矩阵

void Matrix::zeros(int m,int n,double** a){

for(int i=0;i

for(int j=0;j

a[j]=0;

}

}

}

// n为矩阵的阶

void Matrix::root(int n,double** A,double** L){

zeros(n,n,L);

for(int i=0;i

for(int j=0;j

double sum=0;

for(int k=0;k

sum+=L[k]*L[j][k];

}

L[j]=(A[j]-sum)/L[j][j];

}

double sum=0;

for(int k=0;k

sum+=L[k]*L[k];

}

L=sqrt(A-sum);// 显然 A-sum<0时不是正定矩阵

}

}

5a9cf3e94de0c652e426013c24ee228c.png

舒马诺

引用回帖:

xiuyouxu at 2012-05-03 22:29:03:

matlab里面直接用root函数就可以了, 下面是我写的c++的:

// 定义Matrix类(略)

// m*n阶0矩阵

void Matrix::zeros(int m,int n,double** a){

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

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

a=0; ...

还是运行不通。。。

0a23c9cbf3c8f9c9607fb4f1f99b8c6b.gif

xiuyouxu

晕,这个回复框不能放代码啊,有一部分代码被替换掉了,代码里不能出现,会被替换掉

0a23c9cbf3c8f9c9607fb4f1f99b8c6b.gif

xiuyouxu

看看这样行不行 \[i\]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值