在R中,比for循环或apply更快

在R中,比for循环或apply更快,r,for-loop,matrix,apply,matrix-multiplication,R,For Loop,Matrix,Apply,Matrix Multiplication,对于这两个矩阵,我想求矩阵X和Q的行的乘积,然后应用ifelse函数,看看乘积是否大于零 n1=1000, m=10000 X=cbind(rnorm(n1),rbinom(n1)) Q=matrix(rnorm(2*m), ncol=2) 为了做到这一点,我在下面尝试了for循环和apply函数 D=10000 ind_beta=matrix(0,n1,D) for (l in 1:D){ ind[,l]=as.vector(ifelse(X%*%Q[l,]>=0,1,0)) }

对于这两个矩阵,我想求矩阵X和Q的行的乘积,然后应用ifelse函数,看看乘积是否大于零

n1=1000, m=10000
X=cbind(rnorm(n1),rbinom(n1))
Q=matrix(rnorm(2*m), ncol=2)
为了做到这一点,我在下面尝试了for循环和apply函数

D=10000
ind_beta=matrix(0,n1,D)
for (l in 1:D){
ind[,l]=as.vector(ifelse(X%*%Q[l,]>=0,1,0))   
}

ind=apply(Q,1,function(x){ifelse(X%*%Q>=0,1,0)})
两个代码给出相同的结果,但这确实很耗时。 有什么办法能让这一切快点吗?提前谢谢。

怎么样:

制作数据(可复制):

您的行程大约需要2.5秒:

system.time(ind <- apply(Q,1,function(x){ifelse(X%*%x>=0,1,0)}))
那么:

制作数据(可复制):

您的行程大约需要2.5秒:

system.time(ind <- apply(Q,1,function(x){ifelse(X%*%x>=0,1,0)}))

伟大的非常感谢。
1*(tcrossprod(X,Q)>=0)
太好了!!非常感谢。
1*(tcrossprod(X,Q)>=0)
system.time({
    XQ <- X %*% t(Q)
    ind2 <- matrix(as.numeric(XQ>=0),nrow(XQ))
})
all.equal(ind,ind2) ## TRUE