[C] C语言练习题 施密特正交化
作者:互联网
题干:
施密特正交规范化
写一个程序完成正交规范化的工作。
注:请不要交换向量的顺序。
输入格式:
第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