하나는 매트릭스 보유 Lambda
으로 p
열과 n
행을 각각의 행에 대한 모든 값을 할당 원 0
(모든 그런 의미에서 첫 번째 열에서의 값과 다른 열에서의 최대 값을 제외시켰다 p - 2
최소값 첫 번째 열을 피하고 후).
지금 for
은 다음과 같이 루프 로이 작업을 수행하고 있습니다.
set.seed(60)
(Lambda = matrix(sample.int(30),5))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 19 20 27 18 15 25
[2,] 16 28 1 4 22 7
[3,] 2 10 8 23 3 12
[4,] 5 6 9 17 11 29
[5,] 26 30 24 13 14 21
m <- ncol(Lambda) - 2
for(ir in seq_len(nrow(Lambda))){
Lambda[ir, match(tail(sort(abs(Lambda[ir, 2:ncol(Lambda)]), decreasing = TRUE), m), Lambda[ir,])] <- 0
}
Lambda
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 19 0 27 0 0 0
[2,] 16 28 0 0 0 0
[3,] 2 0 0 23 0 0
[4,] 5 0 0 0 0 29
[5,] 26 30 0 0 0 0
좋아, 하나는 목표를 얻지 만 행이 많으면 문제가 될 것입니다. for
루프를 사용하지 않는 솔루션이 있습니까? 함께 할 수는 lapply
있지만 정말 효율적인지 확실하지 않습니다. 아마도 data.table
행렬을 변환 한 후에?
감사합니다!
다음을 생각할 수있는 벡터화 된 버전 :
vectorized <- function(Lambda) {
max <- matrixStats::rowMaxs(Lambda, cols = -1)
noreplace <- sweep(Lambda, 1, max, "==")
noreplace[, 1] <- TRUE
Lambda * noreplace
}
그러나 @Vandenman의 for 루프보다 빠르지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다