我正在尝试提出一种算法,该算法允许我生成一个随机的 N 维实值 vector ,该 vector 与一组已生成的 vector 线性无关。我不想强制它们正交,只是线性独立。我知道 Graham-Schmidt 存在于正交化问题中,但是是否有更弱的形式只能给出线性独立 vector ?
最佳答案
第1步.生成随机 vector vr
。
第 2 步. 将 vr
复制到 vo
并更新如下:对于 v1、v2 中每个已生成的 vector
,减去 v
。 .. vnvo
在 vi
上的投影。
结果是一个与 v1, v2...vn
跨越的子空间正交的随机 vector 。如果该子空间是基,那么它当然是零 vector :)
可以根据vr的范数与vo的范数的比较来判断初始 vector 是否线性无关。非线性独立 vector 的 vo 范数为零或接近零(某些数值精度问题可能使其成为一个小非零数,约为 epsilon 的几倍,这可以通过应用程序相关的方式进行调整)。
伪代码:
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 和子空间之间的角度:在这种情况下,将其计算为 theta = arcsin(norm(vo)/norm(vr))
。与零显着不同的角度对应于线性无关 vector 。
关于c - 生成与一组 vector 线性无关的随机 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210354/