1. 程式人生 > 其它 >N-46. 施密特正交規範化

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;  
}