首页 文章

将矢量与矩阵中的选定元素进行比较

提问于
浏览
1

我想比较一个巨大的向量与R中矩阵中的选定元素 .

A是矩阵,B是矢量 . 我想比较B的每个元素与来自A的选定元素.C和D是选择标准 . 它们是与B相同长度的向量.C指定A的行号,D指定列号 . A的维数为10 * 100,B,C,D都是长度为72000的向量 . 代码为for循环:

for ( j in 1:length(B) ){
  E[j] <- B[j] >= A[ C[j], D[j] ]
}

这太慢了 . 我通过定义一个包含来自A的元素的向量来对此进行矢量化:

A1 <- array(0, length(B))
A2 <- A[,D]
for ( j in 1:length(B) ){
  A1[j] <- A2[ C[j], j ]
}   
E <- B >= A1

这仍然太慢了 . 有更好的方法吗?

3 回答

  • 1

    我能想到的绝对最快的方法是将A视为向量并提取所需的元素 . 矩阵实际上只是具有维度属性的向量 . 算术运算非常快,并且 [ 子集运算符被矢量化 .

    要获得所需的元素,您需要做的就是将所需的列号( D )乘以总行数,然后减去所需的行号( C )减去总行数,例如 A[ D * nrow(A) - ( nrow(A) - C) ] ,如下例所示:

    set.seed(1234)
    A <- matrix( sample(5,16,repl=TRUE) , 4 )
    #    [,1] [,2] [,3] [,4]
    #[1,]    2    1    1    5
    #[2,]    1    3    5    5
    #[3,]    2    1    1    2
    #[4,]    1    4    2    1
    
    ## Rows
    C <- sample( nrow(A) , 3 , repl = TRUE )
    #[1] 1 2 3
    
    ## Columns
    D <- sample( ncol(A) , 3 , repl = TRUE )
    #[1] 1 3 2
    
    ## Treat A as a vector
    ## Elements are given by:
    rs <- nrow(A)
    A[ D * rs - ( rs - C) ]
    #[1] 2 5 1
    
  • 0

    您可以根据选择标准B和C轻松选择与B的每个条目对应的A的每个元素 . 将B和C组合成两列矩阵,然后使用该矩阵组合A:

    A.subset <- A[cbind(B, C)]
    

    您现在有一个与B长度相同的向量(A.subset),并且可以以高效的方式执行您喜欢的任何(矢量化)比较 .

  • 2

    我不确定我是否完全接受了您的问题,但我认为您需要以下内容:

    # setup some mock data
    a <- matrix(rnorm(1000,0,1),nrow=10, ncol=100)
    b <- rnorm(100,0,1)
    c <- rep(1:10,10)
    d <- 1:100
    
    # define function
    compare <- function(v,row,column)
        return(v >= a[row,column]) # you might want this to output to something else
    
    # apply the comparison function to the b, c, and d vectors
    mapply(FUN=compare, b, c, d)
    

相关问题