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;
}
本文作者:misasteria
本文链接:https://www.cnblogs.com/misasteria/p/16259869.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步