N-46. 施密特正交規範化
阿新 • • 發佈:2022-05-11
大家還記得施密特正交規範化嗎?不記得了?那麼請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; }