生成与一组向量线性无关的随机向量

时间:2014-03-05 22:03:49

标签: c linear-algebra vector-graphics

我正在尝试提出一种算法,它允许我生成一个随机的N维实值向量,该向量相对于一组已经生成的向量是线性独立的。我想强迫它们正交,只是线性独立。我知道Graham-Schmidt存在正交化问题,但是有一种较弱的形式只能给出线性独立的向量吗?

2 个答案:

答案 0 :(得分:3)

步骤1.生成随机向量vr

步骤2.将vr复制到vo并按如下方式更新:对于v中每个已生成的向量v1, v2... vn,减去vo的投影vi

结果是与v1, v2... vn跨越的子空间正交的随机向量。如果那个子空间是基础,那么它是零向量,当然:)

初始向量是否线性独立的决定可以基于vr的范数与vo的范数的比较来做出。非线性无关矢量将具有VO范数是零或接近零(一些数值精度的问题可能使其几次小量的量级的小的非零数,这可以在一个应用程序相关的方式被调谐)。

伪代码:

vr = random_vector()
vo = vr
for v in (v1, v2, ... vn):
    vo = vo - dot( vr, v ) / norm( v )
if norm(vo) < k1 * norm(vr):
    # this vector was mostly contained in the spanned subspace
else:
    # linearly independent, go ahead and use

这里k1是一个非常小的数字,也许是1e-8到1e-10?

您还可以在vr和子空间之间使用 angle :在这种情况下,将其计算为theta = arcsin(norm(vo) / norm(vr))。基本上不同于零的角度对应于线性独立的矢量。

答案 1 :(得分:0)

有点 OTT 方案是生成一个 NxN 非奇异矩阵,并使用它的列(或行)作为 N 个线性无关的向量。

要生成一个非奇异矩阵,可以生成它的 SVD 并相乘。更详细:

a/ 生成一个“随机”的 NxN 正交矩阵 U

b/ 生成一个'随机' NxN 对角矩阵 S,对角线上有正数

c/ 生成一个“随机”的 NxN 正交矩阵 V

d/计算

M = U*S*V'

要生成“随机”正交矩阵 U,可以使用以下事实:每个正交矩阵都可以写为家庭反射器的乘积,即矩阵形式为

H(v) = I - 2*v*v'/(v'*v)

其中 v 是一个非零随机向量。 这样就可以

initialise U to I
for( i=1..N)
   generate a none zero vector v
   update: U := H(v)*U

请注意,如果所有这些矩阵乘法都变得繁琐,可以编写一个特殊的例程来更新 U。将 H(v) 应用于向量 u 是 O(N):

u -> u - 2*(h'*u)/(h'*h) * h

因此将 H 应用于 U 可以在 O(N 平方) 而非 O( N 立方) 中完成

这种方案的一个优点是可以控制向量的“线性独立程度”。对角线元素的乘积是(最多符号)M 的行列式,因此如果这个乘积“非常小”,则向量“几乎”线性相关