我想比较一个巨大的向量与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
这仍然太慢了。有更好的方法吗?
答案 0 :(得分:2)
您可以根据选择标准B和C轻松选择与B的每个条目对应的A的每个元素。将B和C组合成一个双列矩阵,然后用该矩阵组合A:
A.subset <- A[cbind(B, C)]
你现在有一个与B长度相同的矢量(A.subset),并且可以以高效的方式执行你喜欢的任何(矢量化)比较。
答案 1 :(得分: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
答案 2 :(得分:0)
我不确定我是否完全接受了您的问题,但我认为您需要以下内容:
# 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)