R中的满秩矩阵

时间:2013-04-09 16:03:46

标签: r matrix

我有一个401 * 5677矩阵(比如G)和一个长度为5677的矢量(比如指数) 我需要获得一个完整的排名(按块)矩阵G.

矩阵G中的块由向量索引定义。例如,如果向量的前50个元素等于1,则表示矩阵的前50列属于组1等。

你知道我怎样才能获得逐块满秩矩阵?这意味着,G的401 * 50“子矩阵”必须是满秩,并且类似地,所有其余的“子矩阵”(每个对应于一个组)也必须是满秩。

我在那个问题上被困了太久了!我怎么能在R?

中做到这一点

更具体地说,假设:

G=matrix(c(1,2,2,4,0,2,2,6,1,2,2,4,5,2,2,3,5,2,2,3),nrow=4) 
index=c(1,1,2,2,2) 

也就是说,G的前两列是group1,其余3列是第二列。 我想编写一个代码来执行以下操作:

  1. 在组1中查找依赖列,并使G的“子矩阵”对应于第一组,满级(例如,如果第1列和第2列依赖,则只保留其中一个)

  2. 在对应于第二组的G矩阵部分中执行相同操作。

  3. 因此,最后,最终矩阵在每个组内是满级(即,对应于组1的最终G的部分是满级,对应于组2的最终G的部分也是满级)

    我还需要知道从G中删除了哪些列(如果有的话),以便从索引向量中删除相应的条目。

    我正在使用的是为了找到在原始数据中使用的算法:

    B=matrix(c(1,2,2,4,0,2,2,6,1,2,2,4,5,2,2,3,5,2,2,3),nrow=4)
    s=c(1,1,2,2,2)
    unique.s<-unique(s)
    k=1
    n=nrow(cB)
    cB<-cor(B)
    for(i in 1:length(unique.s)){
      u=unique.s[i]
      l=length(which(s==u))
      for(r in 1:n){
        for(c in k:k+l-1){
          if(r<c && cB[r,c]==1){
            B[,c]=NA
            s[c]=NA
          }
       }
    
      }
      k=k+l
    
    }
    
    B.final<-B[,complete.cases(t(B))]
    s.final<-s[complete.cases(s)]
    

    我尝试根据相关矩阵找到依赖列(如果这是正确的,我现在不会)。因此,每次处理一组B矩阵时,我尝试(没有成功),根据它们是否具有等于1的相关性来移除B列。 例如,如果cB [1,2]为1,那么我想删除B [,2]列。该程序适用于B [,1:2],这是第1组的B部分和B [,3:5]的一部分,这是第2组的部分。

1 个答案:

答案 0 :(得分:1)

根据评论编辑

仅修改为Vec[1:nrow(G)]

要确切地告诉您要求的内容有点难,但我相信您希望根据向量中的唯一值来对矩阵进行子集化,比如说Vec,其中元素索引为{{1是Vec的行索引。

如果您正在寻找,那么您可以迭代Vec中的唯一值

G

或者,您可以使用

 lapply(unique(Vec), function(Ind) G[which(Vec[1:nrow(G)]==Ind), ])  # which is not needed if length(Vec) == nrow(G)