21

免责声明
这不是一个严格的编程问题,但大多数程序员迟早都要处理数学(尤其是代数),所以我认为这个答案将来可能对其他人有用。

现在
我要检查的问题是 m 维 n 的向量是否是线性独立的。如果 m == n,您可以使用向量构建一个矩阵并检查行列式是否为 != 0。但是如果 m < n 怎么办?

有什么提示吗?


另请参阅此视频讲座

4

8 回答 8

22

构造一个向量矩阵(每个向量一行),并对该矩阵执行高斯消元法。如果任何矩阵行抵消,它们就不是线性独立的。

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

于 2009-02-10T12:07:37.000 回答
7

构造一个矩阵M,其行是向量并确定 的秩M。如果 的秩M小于m(向量的数量),则存在线性相关性。在确定您的排名的算法中,M您可以在获得一行零后立即停止该过程,但是运行该算法以完成具有提供向量生成集的维度的额外财富。哦,确定等级的算法M仅仅是高斯消除。

注意数值不稳定性。请参阅数字食谱中第二章开头的警告。

于 2009-02-10T12:08:36.720 回答
3

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

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

于 2009-02-10T12:10:52.627 回答
2

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

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

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

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

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

于 2010-12-02T12:42:06.067 回答
1

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

于 2009-02-10T18:11:36.457 回答
1

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

det(M * M^T)

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

于 2009-04-06T17:52:35.370 回答
1

对不起,伙计,我的错...


上面链接中提供的源代码结果是不正确的,至少我测试过的python代码和我转换过的C++代码并没有一直生成正确的答案。(而对于上面链接中的示例,结果是正确的:)--)

要测试 python 代码,只需mtx

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

返回的结果如下:

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

不过,我有办法摆脱这种情况。正好这次我把函数的matalb源代码改成rref 了C++。您可以运行matlab并使用type rref命令获取rref.

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

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

于 2010-12-11T08:04:14.210 回答
0

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

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

简而言之,原因是方程组的任何解m x n也是方程n x n组的解(您正在尝试求解Av=0)。要获得更好的解释,请参阅Wikipedia,它比我能更好地解释它。

于 2013-04-11T13:31:08.740 回答