N-46. 施密特正交规范化

大家还记得施密特正交规范化吗?不记得了?那么请David给大家介绍一下:

我们要将向量组​正交规范化。

(1). 正交化:

(2). 规范化:对所有的​

这样,求出来的即为正交规范化的向量。

David每次一看这个式子就头疼。为了David的头的健康着想,请你给他写一个程序,按照以上规则完成正交规范化的工作。

注:请不要交换向量的顺序。

输入格式:

第1行,输入整数n,d。分别表示向量的数目和维数

第2~n+1行,每行d个浮点数,用空格隔开,表示一个向量

输出格式:

共n行,每行输出d个浮点数(保留2位小数),用空格隔开,表示一个向量

直接按部就班的求就行

#include <stdio.h>  
#include <string.h>  
#include <math.h>  
double a[20][20] = {0};  
double ans[20] = {0};  
int n, d;  
double multi (int n, int m) {  
    double res = 0;  
    for (int i = 1; i <= d; i++) res += a[n][i] * a[m][i];  
    return res;  
}  
// 求数量积
int main () {  
    scanf("%d%d", &n, &d);  
    for (int i = 1; i <= n; i++) {  
        for (int j = 1; j <= d; j++) {  
            scanf("%lf", &a[i][j]);  
        }  
    }  // 读入
    for (int i = 1; i <= n; i++) {  
        for (int j = 1; j <= d; j++) {  
            a[i][j] -= ans[j];  
        }  
        memset(ans, 0, sizeof ans);  
// 更新ans       
 for (int j = 1; j <= d; j++) {  
            for (int k = 1; k <= i; k++) {  
                ans[j] += multi(i + 1, k) / multi(k, k) * a[k][j];  
            }  
        }     
    }  
    for (int i = 1; i <= n; i++) {  
        for (int j = 1; j <= d; j++) {  
            if (j != d)printf("%.2lf ", a[i][j] / sqrt(multi(i,i)));  
            else printf("%.2lf", a[i][j] / sqrt(multi(i,i)));  
        }  
        printf("\n");  
    }  
    return 0;  
}  


posted @ 2022-05-11 21:02  misasteria  阅读(392)  评论(0编辑  收藏  举报