R将一系列向量添加到矩阵中,并在每次添加时操作函数

时间:2014-07-26 14:23:44

标签: r loops matrix vector rbind

我有以下难题。下面的代码片段从矢量池中获取矢量,将矢量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])  
    #---------------------------------------------------------------------

我已根据需要预先分配,但确实需要摆脱循环,因为它太耗时。我玩过各种各样的想法,不能想办法做到这一点。

任何帮助都将一如既往地感激不尽。如果有什么我错过的请告诉我。

1 个答案:

答案 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)