Sue*_*Sue 1 for-loop r matrix apply matrix-multiplication
对于这两个矩阵,我想找到矩阵X和Q行的乘积,并应用ifelse函数来查看产品是否大于零.
n1=1000, m=10000
X=cbind(rnorm(n1),rbinom(n1))
Q=matrix(rnorm(2*m), ncol=2)
Run Code Online (Sandbox Code Playgroud)
为此,我尝试了循环并应用以下功能.
D=10000
ind_beta=matrix(0,n1,D)
for (l in 1:D){
ind[,l]=as.vector(ifelse(X%*%Q[l,]>=0,1,0))
}
Run Code Online (Sandbox Code Playgroud)
和
ind=apply(Q,1,function(x){ifelse(X%*%Q>=0,1,0)})
Run Code Online (Sandbox Code Playgroud)
两个代码都给出了相同的结果,但实际上非常耗时.有没有办法让这个快?提前致谢.
怎么样:
制作数据(可重复):
set.seed(101)
n1=1000; m=10000
X=cbind(rnorm(n1),rbinom(n1,size=1,prob=0.6))
Q=matrix(rnorm(2*m), ncol=2)
Run Code Online (Sandbox Code Playgroud)
你的方式大约需要2.5秒:
system.time(ind <- apply(Q,1,function(x){ifelse(X%*%x>=0,1,0)}))
Run Code Online (Sandbox Code Playgroud)
这大约需要0.3秒:
system.time({
XQ <- X %*% t(Q)
ind2 <- matrix(as.numeric(XQ>=0),nrow(XQ))
})
Run Code Online (Sandbox Code Playgroud)
结果匹配:
all.equal(ind,ind2) ## TRUE
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
741 次 |
最近记录: |