我有一个 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 组中的依赖列,并使 G 的“子矩阵”对应于第一组,满秩(例如,如果第 1 列和第 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 组的部分。