我有两个矩阵,一个是二进制(零或一),另一个是相同维度的整数矩阵,这些是方阵。
我想要一种以特定方式组合它们的有效方法,而无需沿每个元素进行迭代。
我想组合它们的方式是从矩阵 A 和矩阵 B 得到一个结果矩阵,对于元素,它采用非零的最小数字。
谁能想到 R 中的一个技巧来实现这一点,我试图在数学上做到这一点,但一直做不到,我想知道是否有办法用条件语句覆盖矩阵?
我的猜测是:
ifelse(A == 0, B, pmin(A, B))
或者可能
ifelse(A == 0, B, ifelse(B == 0, A, pmin(A, B)))
如果这不是您要查找的内容,请澄清(并可能提供示例。)
matA <- matrix(-8:7, 4,4); set.seed(123)
matB <- matrix(sample(0:1, 16, repl=TRUE), 4, 4)
matC <- matrix(NA, nrow(matA), ncol(matA))
matC[] <- pmin( matA, MatB)
matC[ matB==0] <- matA[matB==0]
matB
#-----------
[,1] [,2] [,3] [,4]
[1,] 0 1 1 1
[2,] 1 0 0 1
[3,] 0 1 1 0
[4,] 1 1 0 1
matC
#---------
[,1] [,2] [,3] [,4]
[1,] -8 -4 0 1
[2,] -7 -3 1 1
[3,] -6 -2 1 6
[4,] -5 -1 3 1
弗洛德尔的方法产生:
> ifelse(matB == 0, matB, pmin(matA, matB))
[,1] [,2] [,3] [,4]
[1,] 0 -4 0 1
[2,] -7 0 0 1
[3,] 0 -2 1 0
[4,] -5 -1 0 1
mnel 的方法产生:
> (matB * !matA) + matA
[,1] [,2] [,3] [,4]
[1,] -8 -4 1 4
[2,] -7 -3 1 5
[3,] -6 -2 2 6
[4,] -5 -1 3 7
从@A_Skeleton 对缩放的评论中,您可以将矩阵分成块:
mnel <- function(matA, matB) {
(matB * !matA) + matA
}
# method takes a function as the argument
mcombine <- function(matA, matB, method) {
chunkSize <- 10000
matC <- matrix(0, nrow(matA), ncol(matA))
for (i in 1:floor(nrow(matA) / chunkSize)) {
curRange <- (chunkSize * (i-1) + 1):(i * chunkSize)
matC[curRange,] <- method(matA[curRange,], matB[curRange,])
}
# handle case where dimensions don't divide exactly into chunks
lastRange <- i*chunkSize:nrow(matA)
matC[lastRange,] <- method(matA[lastRange,], matB[lastRange,])
matC
}
# Using mnel's method:
matC <- mcombine(matA, matB, mnel)