我正在尝试提出一种算法,它允许我生成一个随机的N维实值向量,该向量相对于一组已经生成的向量是线性独立的。我不想强迫它们正交,只是线性独立。我知道Graham-Schmidt存在正交化问题,但是有一种较弱的形式只能给出线性独立的向量吗?
答案 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 的行列式,因此如果这个乘积“非常小”,则向量“几乎”线性相关