0

我有一个 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 矩阵部分做同样的事情。

所以,最后,最终矩阵在每个组内都是满秩的(即最终G中对应于组1的部分是满秩的,最终G对应于组2的部分也是满秩的)。

我还需要知道从 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 矩阵时,我都会尝试(没有成功)删除 B 的列,具体取决于它们是否具有等于 1 的相关性。例如,如果 cB[1,2] 为 1,那么我想删除 B[,2] 列。该过程对 B[,1:2] 应用一次,B[,1:2] 是第 1 组的 B 部分,B[,3:5] 是第 2 组的部分。

4

1 回答 1

1

根据评论编辑

唯一的修改是Vec[1:nrow(G)]

很难准确说出您的要求,但我相信您正在寻找基于向量中的唯一值的矩阵子集,例如Vec,其中元素索引 toVec是行索引G

如果这就是您要查找的内容,那么您可以遍历 Vec 中的唯一值

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

或者,您可以使用

 by(G, Vec[1:nrow(G)], function(x) as.matrix(x, ncol=ncol(G)))
于 2013-04-09T16:38:36.873 回答