我是新手使用matlab.我找不到从给定的一组矢量中提取线性独立矢量的最大子集的明显方法.
所以给定一个集合V = [v1 v2 - vn]其中dim(vi)>> n(i = 1,2,3,....)我需要找到一组随机的r个线性独立向量"vi" (其中r是最大的),即从V中移除ALL(nr)线性相关的"vi"向量.抱歉,如果这是不明确的,但找不到更好的方式来说明它.
我将假设你的向量是全n维的,并且我们可以将它们全部连接成一个矩阵.如果我们进入矩阵和线性代数,你要找的是矩阵的列空间.简而言之,列空间被定义为矩阵中的列集,可以在n维度空间中唯一地生成另一个向量.或者,它是列向量的所有可能线性组合的集合.因此,如果要查找最大的线性独立向量集,您所要做的就是确定矩阵的列空间是什么.
因此,考虑到你的矩阵V是大小的n x m,在那里我们有m列/矢量,具有大小的每一列存在n x 1(或n行),你会打电话rref或[R ow- [R得出é chelon ˚F ORM(RREF)命令.这会将矩阵降低到行减少的梯形形式.这是找到矩阵的列空间的开始.你会这样称呼它:
[R, RB] = rref(V);
Run Code Online (Sandbox Code Playgroud)
R将包含的RREF形式V和RB将包含的索引或列数R是表格的列空间.因此,如果要生成线性独立向量,则只需执行以下操作:
VMax = V(:,RB);
Run Code Online (Sandbox Code Playgroud)
VMax将只包含那些V形成列空间的列,因此它们是线性独立的向量.如果你想确定我们有多少个独立的向量,你只需要计算RB我们有多少个值:
r = numel(RB);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子来说明我的观点.假设我有这个矩阵:
>> 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
Run Code Online (Sandbox Code Playgroud)
第二列/向量就是第一个向量.第三列/向量只是第一个向量加上第二个向量,或者它可以是第一个或第二个向量的两倍.无论哪种方式,这都不是线性独立的向量,因为它是基于第一个向量.第二个向量也是如此.最后一个向量独立于其他三个,因为我们无法创建组合或缩放,可以从其他三个生成最后一个向量.如果我们打电话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
Run Code Online (Sandbox Code Playgroud)
R包含行减少的梯形形式,同时RB告诉我们哪些列是线性独立的或形成列空间A.如您所见,只有第1列和第4列是线性独立的,这非常有意义.如果你还看一下最后两行R,我们可以看到它们全部由零组成.这暗示了矩阵的等级,其中它只是非零的总行数(或列,取决于您正在做的事情).这也告诉你有多少向量形成列空间.
要完成任务,只需执行以下操作:
>> VMax = V(:,RB)
VMax =
1 0
2 9
3 7
4 3
Run Code Online (Sandbox Code Playgroud)
如您所见,每列VMax都是一个线性独立的向量V,也形成了列的空间V.
现在,您的下一个任务是每次运行算法时从此列空间中随机选择线性独立的向量.请记住,因为有多种方法可以生成列空间,所以解决方案rref只会为您提供一个这样的列空间.如果我正确地解释您的问题,您希望生成随机列空间并每次选择这些向量的子集.感谢Luis Mendo(以及来自knedlsepp的温和产品),您可以做的是随机重新排列或置换列,然后rref在这个置换矩阵上运行.
因此,你可以这样做:
ind = randperm(size(V,2));
Vperm = V(:,ind);
[R,RB] = rref(Vperm);
VMax = Vperm(:,RB);
Run Code Online (Sandbox Code Playgroud)
randperm将生成一个随机排列数组,从1到您指定的参数randperm.在我们的例子中,这是矩阵中的总列数V.我们使用这个数组随机地移动列V,将其存储Vperm并运行我们之前完成的代码.通过执行此随机改组,您将输入偏置rref为强制它选择不同的基矢量,但如果您有几个线性相关的矢量,则会出现这样一种情况:我们将选择其中一个线性相关矢量建立我们的基础.
| 归档时间: |
|
| 查看次数: |
2808 次 |
| 最近记录: |