免责声明
这不是一个严格的编程问题,但大多数程序员迟早都要处理数学(尤其是代数),所以我认为这个答案将来可能对其他人有用。
现在
我要检查的问题是 m 维 n 的向量是否是线性独立的。如果 m == n,您可以使用向量构建一个矩阵并检查行列式是否为 != 0。但是如果 m < n 怎么办?
有什么提示吗?
另请参阅此视频讲座。
免责声明
这不是一个严格的编程问题,但大多数程序员迟早都要处理数学(尤其是代数),所以我认为这个答案将来可能对其他人有用。
现在
我要检查的问题是 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
并查看最大与最小的比率。如果比率不是很大,则向量是独立的。
当放入大小为 mxn 的矩阵 M 中时,检查 m 行向量是否线性无关的另一种方法是计算
det(M * M^T)
即mxm方阵的行列式。当且仅当 M 具有一些相关行时,它将为零。然而,高斯消除通常应该更快。
对不起,伙计,我的错...
上面链接中提供的源代码结果是不正确的,至少我测试过的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 double
c++ 中的数据类型。否则,结果会被截断,与matlab结果不一致。
我一直在 ns2 中进行大型模拟,所有观察到的结果都是合理的。希望这会帮助你和任何其他遇到问题的人......
一种非常简单的方法(不是计算效率最高)是简单地删除随机行,直到m=n
然后应用行列式技巧。
m < n
:删除行(使向量更短)直到矩阵为正方形,然后m = n
:检查行列式是否为0(如你所说)m < n
(向量的数量大于它们的长度):它们是线性相关的(总是)。简而言之,原因是方程组的任何解m x n
也是方程n x n
组的解(您正在尝试求解Av=0
)。要获得更好的解释,请参阅Wikipedia,它比我能更好地解释它。