其他分享
首页 > 其他分享> > [C] C语言练习题 施密特正交化

[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