如何检查m个大小的向量是否是线性无关的?

时间:2009-02-10 12:00:36

标签: math vector matrix linear-algebra

声明
这不是严格意义上的编程问题,但是大多数程序员不久就要处理数学(特别是代数),所以我认为答案可能会对将来的其他人有用。

现在问题
我试图检查维数n的m个向量是否是线性无关的。如果m == n,你可以使用向量构建一个矩阵并检查行列式是否为!= 0.但是如果m< N'

任何提示?


另见this video lecture

8 个答案:

答案 0 :(得分:22)

构造向量矩阵(每个向量一行),并在此矩阵上执行Gaussian elimination。如果任何矩阵行取消,则它们不是线性独立的。

琐碎的情况是当m> n,在这种情况下,它们不能是线性独立的。

答案 1 :(得分:7)

构造一个矩阵M,其行是向量,并确定M的等级。如果M的等级小于m(向量的数量),则存在线性相关性。在确定M等级的算法中,一旦获得一行零,就可以停止该过程,但运行算法完成后会增加提供向量的跨越集的维度。哦,确定M等级的算法仅仅是高斯消除。

注意数值不稳定。请参阅Numerical Recipes中第二章开头的警告。

答案 2 :(得分:3)

如果m<n,你将不得不对它们进行一些操作(有多种可能性:高斯消元法,正交化等,几乎任何可用于求解方程的变换都可以)并检查结果(例如,高斯消除=&gt;零行或列,正交化=&gt;零向量,SVD =&gt;零奇异数)

然而,请注意,这个问题对于程序员来说是一个不好的问题,而这个问题对于程序来说是一个难题。这是因为每个线性相关的n<m向量集都附近有一组不同的线性独立向量(例如,问题在数值上不稳定)

答案 3 :(得分:2)

这些天我一直在研究这个问题。

以前,我发现了一些关于高斯或高斯 - 乔丹消除的算法,但大多数算法仅适用于方阵,而不是一般矩阵。

要申请一般矩阵,最佳答案之一可能是: http://rosettacode.org/wiki/Reduced_row_echelon_form#MATLAB

您可以找到各种语言的伪代码和源代码。 至于我,我将Python源代码转换为C ++,导致上面链接中提供的C ++代码在某种程度上是复杂的,不适合在我的模拟中实现。

希望这会对你有所帮助,祝你好运^^

答案 4 :(得分:1)

如果计算能力不是问题,可能最好的方法是找到矩阵的奇异值。基本上你需要找到M'*M的特征值,并查看最大值与最小值的比率。如果比率不是很大,则向量是独立的。

答案 5 :(得分:1)

另一种检查m行向量是线性无关的方法,当放入大小为mxn的矩阵M时,是计算

det(M * M^T)

即。 mxm方阵的行列式。当且仅当M具有某些依赖行时,它将为零。然而,高斯消除通常应该更快。

答案 6 :(得分:1)

对不起男人,我的错误......


上面链接中提供的源代码证明是不正确的,至少我测试的python代码和我转换的C ++代码并没有始终生成正确的答案。 (虽然对于上面链接中的例子,结果是正确的:) - )

要测试python代码,只需将mtx替换为

即可
[30,10,20,0],[60,20,40,0]

,返回的结果如下:

[1,0,0,0],[0,1,2,0]

尽管如此,我还是有办法解决这个问题。就是这次我将rref函数的matalb源代码转换为C ++。您可以运行matlab并使用type rref命令获取rref的源代码。

请注意,如果您正在处理一些非常大的值或非常小的值,请确保在c ++中使用long double数据类型。否则,结果将被截断并与matlab结果不一致。

我一直在ns2中进行大型模拟,所有观察到的结果都是合理的。 希望这会帮助你和任何其他已经解决问题的人......

答案 7 :(得分:0)

一种非常简单的方法,即计算效率最高的方法是简单地删除随机行,直到m=n,然后应用行列式技巧。

  • m < n:删除行(使矢量更短),直到矩阵为正方形,然后
  • m = n:检查行列式是否为0(正如您所说)
  • m < n(向量的数量大于它们的长度):它们是线性相关的(总是)。

简而言之,原因是m x n方程组的任何解决方案也是n x n方程组的解决方案(您试图解决Av=0) 。有关更好的解释,请参阅Wikipedia,它可以比我更好地解释它。