编程题:Gram-Schmidt算法
Gram-Schmidt算法用来确定一组 $n$ 向量 $a_1,\cdots,a_k$ 是否为线性无关的。
给定 $n$ 向量 $a_1,\cdots,a_k$,令 $q_0$ 为 $n$ 维零向量,对于 $i=1,\cdots,k$,
1. 正交化:$\tilde q_i=a_i-(q_1^Ta_i)q_1-\cdots-(q_{i-1}^Ta_i)q_{i-1}$
2. 检验线性相关性:若 $\tilde q_i=0$,则算法结束,当前向量和之前的向量线性相关
3. 规范化:$q_i=\cfrac{\tilde q_i}{||\tilde q_i||}$
对于 $i=1$,由于 $q_0$不存在,步骤1简化为 $\tilde q_1=a_1$。如果算法没有提前退出,则向量组 $a_1,\cdots,a_k$ 是线性无关的;否则,若算法在 $i=j$ 时退出,即 $\tilde q_j=0$,即意味着 $a_j$ 是 $a_1,\cdots,a_{j-1}$ 的线性组合,向量组是线性相关的。
又:
#### Euclid范数
一个 $n$ 向量 $x$ 的Euclid范数记为 $||x || $ :
$$
||x|| = \sqrt{x_1^2+x_2^2+\cdots+x_n^2}
$$
也可以表示为向量与其自身做内积的平方根 $||x||=\sqrt{x^Tx}$。
#### 向量的内积(点积)
两个 $n$ 向量的内积(也称作点积)定义为如下的标量:
$$
a^Tb=a_1b_1+a_2b_2+\cdots+a_nb_n
$$
即对应元素乘积的和。有的书上记做 $a\cdot b$ 。
### 输入格式:
在第一行分别给出两个整数N,M。N表示向量的维度,M表示向量的个数。
接下来M行给出M个向量,用浮点数表示,每个数字之间用空格分隔。
(对于区分float和double的语言,建议使用double类型)
### 输出格式:
如果发现输入向量组是向量线性无关的,则输出 NO,并在第二行输出最终的 $q$,输出使用保留两位小数,每个数字之间一个空格。
如果发现输入向量组是向量线性相关的,则输出YES,并接着输出算法运行到第几个向量(从1开始)时停止的。
### 输入样例1:
in
5 4
1 2 -1 -2 -3
2 -1 3 -2 7
-1 3 2 4 28
3 10 -2 1 1
### 输出样例1:
out
NO
0.52 0.36 0.49 0.59 -0.14
### 输入样例2:
in
3 4
0.1 1 2
-0.3 0 -5
3 0 -0.3
0.2 -1 3
### 输出样例2:
在这里给出相应的输出。例如:
out
YES 4
答案:若无答案欢迎评论
给定 $n$ 向量 $a_1,\cdots,a_k$,令 $q_0$ 为 $n$ 维零向量,对于 $i=1,\cdots,k$,
1. 正交化:$\tilde q_i=a_i-(q_1^Ta_i)q_1-\cdots-(q_{i-1}^Ta_i)q_{i-1}$
2. 检验线性相关性:若 $\tilde q_i=0$,则算法结束,当前向量和之前的向量线性相关
3. 规范化:$q_i=\cfrac{\tilde q_i}{||\tilde q_i||}$
对于 $i=1$,由于 $q_0$不存在,步骤1简化为 $\tilde q_1=a_1$。如果算法没有提前退出,则向量组 $a_1,\cdots,a_k$ 是线性无关的;否则,若算法在 $i=j$ 时退出,即 $\tilde q_j=0$,即意味着 $a_j$ 是 $a_1,\cdots,a_{j-1}$ 的线性组合,向量组是线性相关的。
又:
#### Euclid范数
一个 $n$ 向量 $x$ 的Euclid范数记为 $||x || $ :
$$
||x|| = \sqrt{x_1^2+x_2^2+\cdots+x_n^2}
$$
也可以表示为向量与其自身做内积的平方根 $||x||=\sqrt{x^Tx}$。
#### 向量的内积(点积)
两个 $n$ 向量的内积(也称作点积)定义为如下的标量:
$$
a^Tb=a_1b_1+a_2b_2+\cdots+a_nb_n
$$
即对应元素乘积的和。有的书上记做 $a\cdot b$ 。
### 输入格式:
在第一行分别给出两个整数N,M。N表示向量的维度,M表示向量的个数。
接下来M行给出M个向量,用浮点数表示,每个数字之间用空格分隔。
(对于区分float和double的语言,建议使用double类型)
### 输出格式:
如果发现输入向量组是向量线性无关的,则输出 NO,并在第二行输出最终的 $q$,输出使用保留两位小数,每个数字之间一个空格。
如果发现输入向量组是向量线性相关的,则输出YES,并接着输出算法运行到第几个向量(从1开始)时停止的。
### 输入样例1:
in
5 4
1 2 -1 -2 -3
2 -1 3 -2 7
-1 3 2 4 28
3 10 -2 1 1
### 输出样例1:
out
NO
0.52 0.36 0.49 0.59 -0.14
### 输入样例2:
in
3 4
0.1 1 2
-0.3 0 -5
3 0 -0.3
0.2 -1 3
### 输出样例2:
在这里给出相应的输出。例如:
out
YES 4
答案:若无答案欢迎评论