标签:练习题 11 int 施密特 C语言 v1 double 正交 向量
题干:
施密特正交规范化
写一个程序完成正交规范化的工作。
注:请不要交换向量的顺序。
输入格式:
第1行,输入整数n,d。分别表示向量的数目和维数
第2~n+1行,每行d个浮点数,用空格隔开,表示一个向量
输出格式:
共n行,每行输出d个浮点数(保留2位小数),用空格隔开,表示一个向量
样例输入:
3 3
1 4 6
2 4 5
2 6 4
样例输出:
0.14 0.55 0.82
0.89 0.31 -0.35
-0.44 0.78 -0.44
数据范围:
1≤n≤10
1≤d≤10
-100≤其他数值≤100
(出于保护隐私的目的,省略出题人信息)
题目分析:
首先读入整型 n 和 d,代表向量个数和维数,然后按照格式读入向量数据。
关键在于如何实现施密特正交化。
采用11*11二维数组存储向量,首先定义一个实现向量点乘的函数,采用值传递,返回double 。
然后实现一个施密特正交化函数。
最后实现一个单位化函数。
代码实现:
#include <stdio.h> #include <math.h> int n=0,d=0; double dotMul(double v1[],double v2[]); void smit(double v1[][11],int i); void normalize(double v[]); int main(int argc, char *argv[]) { double vector[11][11]={{0}}; scanf("%d %d",&n,&d); int i=0,j=0; for(i=0;i<n;i++) { for(j=0;j<d;j++) scanf("%lf",&vector[i][j]); } for(i=0;i<n;i++) smit(vector,i); for(i=0;i<n;i++) normalize(vector[i]); for(i=0;i<n;i++) { printf("%.2lf",vector[i][0]); for(j=1;j<d;j++) printf(" %.2lf",vector[i][j]); printf("\n"); } return 0; } //点乘 double dotMul(double v1[],double v2[]) { double res=0; int i=0; for(i=0;i<d;i++) { res+=v1[i]*v2[i]; } return res; } //规范化 void smit(double v1[][11],int i) { int j = 0,k=0; for(j=i-1;j>=0;j--) { double up = dotMul(v1[i],v1[j]); double dowm = dotMul(v1[j],v1[j]); for(k=0;k<d;k++) v1[i][k] -= up * v1[j][k] /dowm; } } //单位化 void normalize(double v[]) { double l = sqrt(dotMul(v,v)); int i=0; for(i=0;i<d;i++) v[i]/=l; }
标签:练习题,11,int,施密特,C语言,v1,double,正交,向量 来源: https://www.cnblogs.com/plum-Third/p/16285162.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。