我有以下难题。下面的代码片段从矢量池中获取矢量,将矢量rb到矩阵并在新矩阵上执行函数并返回标量结果。
In2 <- diag(nXtr+1)
mu <- array(1,c(dim(Xcal)[1],1))
Y.hat.calib <- array(0,c(nC,1))
alpha <- array(0,c(nC,1))
P = c()
for (i in 1:dim(Xcal)[1]){
Xtr2 <- rbind(Xtr,Xcal[i,])
K2 <-(Xtr2%*%t(Xtr2)+1)^2
rowCnt <- dim(Xtr2)[1]
mu[i] <- sqrt(1 + t(c(rep(1,(rowCnt-1)),0))%*%solve(K2+a*In2)%*%K2%*%c(rep(0,(rowCnt-1)),1))
#---------------------------------------------------------------------
Y.hat.calib[i] <- kCal[,i]%*%solve(K + a*In)%*%Ytr
alpha[i] <- (abs(Y.hat.calib[i] - Ycal[i]))/mu[i]
P <- c(P,alpha[i])
#---------------------------------------------------------------------
我已根据需要预先分配,但确实需要摆脱循环,因为它太耗时。我玩过各种各样的想法,不能想办法做到这一点。
任何帮助都将一如既往地感激不尽。如果有什么我错过的请告诉我。
答案 0 :(得分:0)
摆脱for
循环不会自动加快速度。您可以对代码进行的最大更改是尽可能避免计算solve
; solve
计算量很大。
我没有尝试确保这没有错误,因为您没有提供示例数据。但是你可以遵循一般的想法:不要在每个循环中执行solve
,在逻辑上将mu
的计算与alpha
分开,并用矩阵乘法替换逐列函数你可以在哪里。
# Your mu boils down to this:
get.mu <- function(Xcal.i, Xtr2=Xtr2, a.times.In2=a.times.In2) {
Xtr2 <- rbind(Xtr, Xcal.i)
K2 <-(Xtr2 %*% t(Xtr2) + 1)^2
first.solve <- solve(K2 + a.times.In2) %*% K2
bread <- c(rep(1, nrow(Xtr2-1)), 0)
sqrt(1 + t(bread) %*% first.solve %*% bread) # mu
}
In2 <- diag(nXtr+1)
# Constants that you recalculated every loop.
a.times.In2 <- a*In2
second.solve <- solve(K + a*In ) %*% Ytr
# Y.hat.calib can be fully calculated in one matrix multiplication.
Y.hat.calib <- kCal %*% second.solve
# Which means that the difference is a constant:
Y.diff <- abs(Y.hat.calib - Ycal)
# So alpha and mu could be calculated like:
mu <- apply(X.cal, 2, get.mu)
alpha <- t(t(Y.diff) / mu.i)