| 查看: 2693 | 回复: 10 | ||
[求助]
带平方根的(LLT)Cholesky算法分解对称正定矩阵 c语言实现
|
||
|
新人,不懂规矩,见谅 大神们好,要求 1先判断任意矩阵A是否为正定对称矩阵,否则,返回输入错误 2若输入为正定对称矩阵,则将其进行带平方根的(LLT)Cholesky算法分解,即实现A=LL^T,其中L为下三角形矩阵。 大致就这意思,求助 定理 |
» 猜你喜欢
A期刊撤稿
已经有5人回复
临港实验室与上科大联培博士招生1名
已经有8人回复
26申博自荐
已经有7人回复
想换工作。大多数高校都是 评职称时 认可5年内在原单位取得的成果吗?
已经有4人回复
带资进组求博导收留
已经有9人回复
求助大佬们,伤口沾上了乙腈
已经有6人回复
最近几年招的学生写论文不引自己组发的文章
已经有9人回复
» 本主题相关价值贴推荐,对您同样有帮助:
S型曲线拟合优度问题,求大神帮忙
已经有9人回复
正定矩阵因子分解~~~
已经有5人回复
方阵是否正定?
已经有4人回复
求助一道关于正定矩阵的证明题
已经有5人回复
求C语言算法 求自然指数方程的根
已经有4人回复
Java矩阵算法大全
已经有62人回复
非负矩阵分解总结之一
已经有62人回复
关于伴随矩阵正定的问题
已经有15人回复
如何实现矩阵之间的比值
已经有4人回复
xiuyouxu
铁杆木虫 (职业作家)
- 应助: 43 (小学生)
- 金币: 16415.7
- 散金: 540
- 红花: 6
- 沙发: 2
- 帖子: 3207
- 在线: 580.4小时
- 虫号: 1256596
- 注册: 2011-04-06
- 性别: GG
- 专业: 数理统计

2楼2012-05-03 21:28:11
|
# 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 所求矩阵L= 2.236068 0 0 0.894427 0.4472136 0 -1.788854 -0.894427 1 我的算法??行??通过啊,而且根本未能实现针对任??阶次的矩阵。。。求大神帮忙~ |
3楼2012-05-03 22:13:16
|
# 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 ========== 工程无法建立 失败了,而且达不到针对任意阶次矩阵的效果! |
4楼2012-05-03 22:17:09
xiuyouxu
铁杆木虫 (职业作家)
- 应助: 43 (小学生)
- 金币: 16415.7
- 散金: 540
- 红花: 6
- 沙发: 2
- 帖子: 3207
- 在线: 580.4小时
- 虫号: 1256596
- 注册: 2011-04-06
- 性别: GG
- 专业: 数理统计
【答案】应助回帖
|
matlab里面直接用root函数就可以了, 下面是我写的c++的: // 定义Matrix类(略) // m*n阶0矩阵 void Matrix::zeros(int m,int n,double** a){ for(int i=0;i } } } // n为矩阵的阶 void Matrix::root(int n,double** A,double** L){ zeros(n,n,L); for(int i=0;i for(int k=0;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时不是正定矩阵 } } |

5楼2012-05-03 22:29:03
6楼2012-05-03 23:00:27
xiuyouxu
铁杆木虫 (职业作家)
- 应助: 43 (小学生)
- 金币: 16415.7
- 散金: 540
- 红花: 6
- 沙发: 2
- 帖子: 3207
- 在线: 580.4小时
- 虫号: 1256596
- 注册: 2011-04-06
- 性别: GG
- 专业: 数理统计

7楼2012-05-03 23:09:59
xiuyouxu
铁杆木虫 (职业作家)
- 应助: 43 (小学生)
- 金币: 16415.7
- 散金: 540
- 红花: 6
- 沙发: 2
- 帖子: 3207
- 在线: 580.4小时
- 虫号: 1256596
- 注册: 2011-04-06
- 性别: GG
- 专业: 数理统计

8楼2012-05-03 23:10:36
xiuyouxu
铁杆木虫 (职业作家)
- 应助: 43 (小学生)
- 金币: 16415.7
- 散金: 540
- 红花: 6
- 沙发: 2
- 帖子: 3207
- 在线: 580.4小时
- 虫号: 1256596
- 注册: 2011-04-06
- 性别: GG
- 专业: 数理统计
【答案】应助回帖
|
void Matrix::zeros(int m,int n,double** a){ for(int i=0;i } } } void Matrix::root(int n,double** A,double** L){ zeros(n,n,L); for(int i=0;i for(int k=0;k } L[j]=(A[j]\[i\]-sum)/L[j][j]; } double sum=0; for(int k=0;k sum+=L\[i\][k]*L\[i\][k]; } L=sqrt(A\[i\]\[i\]-sum); } } 把上面的中括号前的反斜线去掉就行了 |

9楼2012-05-03 23:12:39
10楼2012-05-03 23:13:29













回复此楼
;