我将假设您的向量都是n 维,并且我们可以将它们全部连接到一个矩阵中。如果我们进入矩阵和线性代数,您正在寻找的是矩阵的the Column Space。简单地说,列空间被定义为矩阵中的一组列,它们可以在n维空间中唯一地产生另一个向量。或者,它是列向量的所有可能线性组合的集合。因此,如果您想找到最大的线性独立向量集,您所要做的就是确定矩阵的列空间是什么。
因此,给定您的矩阵V,其大小为n x m,其中我们有m 列/向量,每列的大小为n x 1(或n 行),您可以调用rref 或 Row-Reded Echelon Form (RREF) 命令。这会将您的矩阵减少到其row-reduced echelon form。这是为矩阵寻找列空间的开始。你可以这样称呼它:
[R, RB] = rref(V);
R 将包含 V 的 RREF 形式,RB 将包含 构成列空间的 R 的索引或列号。因此,如果你想产生你的线性独立向量,你只需要这样做:
VMax = V(:,RB);
VMax 将仅包含构成列空间的V 的那些列,因此也包含那些是线性独立向量的列。如果您想确定我们有 多少 个独立向量,您只需计算我们有多少 RB 的值:
r = numel(RB);
这里有一个简单的例子来说明我的观点。假设我有这个矩阵:
>> V = [1 1 2 0; 2 2 4 9; 3 3 6 7; 4 4 8 3]
V =
1 1 2 0
2 2 4 9
3 3 6 7
4 4 8 3
第二列/向量只是第一个向量。第三列/向量只是第一个向量加上第二个向量,或者它可以是第一个或第二个向量的两倍。无论哪种方式,这不是线性独立向量,因为它基于第一个向量。第二个向量也是如此。最后一个向量独立于其他三个向量,因为我们无法创建组合或缩放来从其他三个向量生成最后一个向量。如果我们调用rref,将会发生这种情况:
>> [R, RB] = rref(V)
R =
1 1 2 0
0 0 0 1
0 0 0 0
0 0 0 0
RB =
1 4
R 包含行缩减梯队形式,而RB 告诉我们哪些列 是线性独立的或构成A 的列空间。如您所见,只有第 1 列和第 4 列是线性独立的,这很有意义。如果您还查看R 的最后两行,我们可以看到它们由全零组成。这暗示了矩阵的rank,它只是非零的总行数(或列数,取决于你在做什么)。这也告诉你有多少向量构成列空间。
要完成您的任务,只需执行以下操作:
>> VMax = V(:,RB)
VMax =
1 0
2 9
3 7
4 3
如您所见,VMax 的每一列都是来自V 的线性独立向量,这也构成了V 的列空间。
现在,您的下一个任务是每次运行算法时从该列空间中随机选择线性独立向量。请记住,由于有多种方法可以产生列空间,rref 的解决方案只会给你一个这样的列空间。如果我正确解释了您的问题,您希望生成随机列空间并每次选择这些向量的子集。感谢 Luis Mendo(也是来自 knedlsepp 的温和刺激),您可以做的是随机重新排列或置换列,然后在这个置换矩阵上运行 rref。
因此,您可以这样做:
ind = randperm(size(V,2));
Vperm = V(:,ind);
[R,RB] = rref(Vperm);
VMax = Vperm(:,RB);
randperm 将生成一个从 1 到您指定给 randperm 的参数的随机排列数组。在我们的例子中,这是矩阵V 中的总列数。我们使用这个数组随机打乱V 的列,将其存储到Vperm 并运行我们之前完成的代码。通过进行这种随机洗牌,您将输入偏置到rref,以便您强制它选择不同的基向量,但是如果您有多个线性相关的向量,那么在某些情况下我们将选择其中一个线性相关向量来构建我们的基础。