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

这还是太慢了。有更好的方法吗?

4

3 回答 3

2

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

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

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

于 2013-05-10T08:41:34.497 回答
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
于 2013-05-10T09:09:46.893 回答
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)
于 2013-05-10T08:35:17.413 回答