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;  
}  
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号