R:如何比较2个矩阵

时间:2014-11-17 15:09:33

标签: r if-statement matrix

我有2个矩阵

  1. matrix1(nrow = 3,ncol = 3)
  2. matrix2(nrow = 5,ncol = 5)
  3. 我知道如何通过另一个矩阵的元素比较和替换conditionnaly矩阵的元素,但只有这两个元素共享相同的[i,j]:

    ifelse(matrix1<0.5, matrix2[,], matrix1[,])
    

    问题:

    在这里,我想用另一列的matrix2元素替换matrix1的元素,如下所示:

    如果 matrix1 [i,j]&lt; 0.5 那么我想替换它是matrix2 [i,j + 2] Else 我想将其替换为matrix2 [i,j + 1]

    问题是:

    • 由于性能不能使用循环
    • 我不知道如何向ifelse解释另一个专栏。

    如何在大矩阵上有效地进行这种比较?

    以下是数据:

    > dput(matrix1)
    structure(c(0.782534098718315, 0.279918688116595, 0.139927505282685, 
    0.485497816000134, 0.150636059232056, 0.976677459431812, 0.101831247797236, 
    0.491994257550687, 0.492571017006412), .Dim = c(3L, 3L))
    
    > dput(matrix2)
    structure(1:25, .Dim = c(5L, 5L))
    

1 个答案:

答案 0 :(得分:3)

此处m1m2是两个矩阵。基于@alexis_laz评论,您可以尝试

indx1 <- tail(seq(ncol(m1)+1),ncol(m1))
indx2 <-  tail(seq(ncol(m1)+2),ncol(m1))
rowInd <- 1:nrow(m1)
ifelse(m1 < 0.5, m2[rowInd,indx2], m2[rowInd, indx1])
#    [,1] [,2] [,3]
#[1,]    6   16   21
#[2,]   12   17   22
#[3,]   13   13   23

或者您可以通过

创建index
 indx <- cbind(c(row(m1)), c(col(m1)))
 indx1 <- cbind(indx[,1], indx[,2]+1)
 indx2 <- cbind(indx[,1], indx[,2]+2)
 ifelse(m1 < 0.5, m2[indx2], m2[indx1])
 #     [,1] [,2] [,3]
 #[1,]    6   16   21
 #[2,]   12   17   22
 #[3,]   13   13   23