免责声明
这不是严格编程问题,但大多数程序很快或之后必须处理的数学(特别是代数),因此我认为,答案可能是有益的其他人的未来。

现在的问题
我想检查,如果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).对于一个更好的解释,请参阅 维基百科, 这解释了它比我好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top