gpt4 book ai didi

r - 基于另一个稀疏矩阵将稀疏矩阵中的非零值替换为零的优化方法

转载 作者:行者123 更新时间:2023-12-04 10:32:26 25 4
gpt4 key购买 nike

我有两个大的稀疏矩阵(比如 A 和 B)。我想根据 B 矩阵将 A 中的非零元素替换为零,该矩阵包含在每一列中排名的所有单个元素的等级。我的输出矩阵应包含来自 A 矩阵的前 n 个和后 n 个排名元素,所有其他非零值应设为零。

下面是我的方法。我在函数 GetTopNBottomN 中使用循环,我想知道它是否可以优化,因为当矩阵变大时它需要很长时间。

#input matrix
TestMatrix = Matrix(c(0.80,0.9,0.6,0,0,0.3,0.5,
0,0,0.3,0,0,0,0,
0.4,0.5,0.6,0,0,0.1,0,
0,0,0,0,0,0,0,
0.3,0.4,0.5,0.2,0.1,0.7,0.8,
0.6,0.7,0.5,0.8,0,0,0),7,sparse = TRUE)

#function to genrate ranks across all the columns for the input matrix
GenerateRankMatrix <- function(aMatrix){ ## Function Begins
n <- diff(aMatrix@p) ## number of non-zeros per column
lst <- split(aMatrix@x, rep.int(1:ncol(aMatrix), n)) ## columns to list
r <- unlist(lapply(lapply(lst,function(x) x * -1), rank)) ## column-wise ranking and result collapsing
RankMatrix <- aMatrix ## copy sparse matrix
RankMatrix@x <- r ## replace non-zero elements with rank
return(RankMatrix)
} # Function Ends

## Function to retain Top N and Bottom N records
GetTopNBottomN <- function(aMatrix,rMatrix){
#aMatrix = original SparseMatrix, rMatrix = RankMatrix
n = 2 ## Top 2 and Bottom 2 Elements across all columns
for(j in 1:ncol(aMatrix)){
MaxValue = max(rMatrix[,j])
if(MaxValue <= 2 * n) next ##Ignore the column if there are less than or equal to 2*n nonzero values
for (i in 1: nrow(aMatrix)){
if(rMatrix[i,j] >n & rMatrix[i,j] <= MaxValue-n){ #IF Cond
aMatrix[i,j] = 0
} #IF ends
}

}
return(aMatrix)
}

#Output
RankMatrix = GenerateRankMatrix(TestMatrix) #Genrate Rank Matrix
#Output Matrix
GetTopNBottomN(TestMatrix,RankMatrix)

最佳答案

我提取了非零元素的索引,并使用 ave() 计算了分组排名

idx <- which(TestMatrix != 0, arr.ind=TRUE)
ranks = ave(-TestMatrix[idx], idx[,2], FUN=rank)

或者实际上是您想要的结果,即要保留的值

keep = ave(-TestMatrix[idx], idx[,2], FUN=function(elt) {
elt = rank(elt)
(elt > 2) & (elt <= length(elt) - 2)
}) == 0
idx = idx[keep,]

然后创建一个新的稀疏矩阵

sparseMatrix(idx[,1], idx[,2], x=TestMatrix[idx])

关于r - 基于另一个稀疏矩阵将稀疏矩阵中的非零值替换为零的优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41796865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com