如何检查,如果n m-型矢量线性无关?
-
22-08-2019 - |
题
免责声明
这不是严格编程问题,但大多数程序很快或之后必须处理的数学(特别是代数),因此我认为,答案可能是有益的其他人的未来。
现在的问题
我想检查,如果m矢量的维n是线性无关的。如果m==n你可以构建一个矩阵使用矢量,并检查是否的决定因素是!= 0.但是,如果m < n?
任何提示?
也参看 这个视频演讲.
解决方案
构建向量的矩阵(每个矢量一行),并执行高斯消去在这个矩阵。如果任何矩阵的行的抵消,它们不是线性独立的。
在简单的情况是,当M> N,在这种情况下,它们不能是线性独立的。
其他提示
构建矩阵M
其行是矢量,并确定M
的秩。如果M
的秩小于m
(向量的数目)再有一个线性关系。在算法来确定M
的等级,你可以只要你获得零一列停止的过程,但在运行的算法来完成具有提供跨越集向量的维数的增加富矿。哦,和算法来确定M
的秩为仅仅高斯消去。
小心为数值不稳定。看到警告,在第二章中数值方法的开始。
如果m<n
,你将不得不做他们一些操作(有多种可能性:高斯消元法,正交等,几乎可以用于求解方程组将做任何改造),并检查结果(例如高斯。消除=>零的行或列,正交=>零向量,SVD =>零单数)
但是请注意,这个问题是一个程序员问一个坏的问题,而这个问题是一个程序来解决不好的问题。这是因为每一个线性地取决于组n<m
矢量的附近有一组不同的线性独立的向量(例如,该问题是数值不稳定)
我一直在这个问题上的这些日子。
此前,我已经找到关于高斯或高斯消乔丹某些算法,但大部分的这些算法只适用于方阵,不是一般的矩阵。
要申请通用矩阵,最好的答案之一可能是这样的: http://rosettacode.org/wiki/Reduced_row_echelon_form#MATLAB
您可以找到各种语言都伪代码和源代码。 至于我,我改变了Python源代码,以C ++,使得在上面的链接提供的C ++代码是某种复杂的和不适当在我的模拟来实现。
希望这会帮助你,祝你好运^^
如果计算能力不是问题,可能是最好的方式是找到该矩阵的奇异值。基本上你需要找到M'*M
的特征值和特征来看的最大到最小的比率。如果该比率不是很大,载体是独立的。
来检查米行向量线性无关,放于尺寸为m×n的矩阵M时的另一种方法,是计算
det(M * M^T)
即。一个MXM正方形矩阵的行列式。这将是零,当且仅当M有一定的相关行。然而高斯消去应该在一般更快。
对不起的人,我的错......
在上面的链接提供的源代码被证明是不正确,至少Python代码我已经测试和我已经改变了C ++代码不生成正确回答所有的时间。 (而用于上述链路的exmample,结果是正确:) - )
要测试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
的源代码。
只需注意,如果你用一些非常大的价值或非常小的值时,确保使用long double
数据类型在C ++中。否则,结果将被截断,并与MATLAB的结果不一致。
我一直在进行在NS2大模拟,并且所有观察到的结果是声音。 希望这将帮助你和任何其他谁也encontered问题...
一个非常简单的方法,这是不是最有效的计算,是简单地删除的随机行,直到 m=n
然后申请的决定因素的伎俩。
m < n
:删除行(使矢量短),直到该矩阵方,然后m = n
:检查是否的决定因素为0(正如你所说的)m < n
(数量大于他们的长):他们是线性依赖(总是).
因此,在短短的,是任何解决方案的系统 m x n
方程式,也是解决 n x n
系统的方程(你想到解决 Av=0
).对于一个更好的解释,请参阅 维基百科, 这解释了它比我好。