-->
当前位置:首页 > 题库 > 正文内容

编程题:Gram-Schmidt算法

Luz3年前 (2022-05-10)题库1091
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







答案:若无答案欢迎评论

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。