【问题标题】:R add series of vectors to matrix and operate function with each additionR将一系列向量添加到矩阵并在每次添加时操作函数
【发布时间】:2014-09-18 06:26:33
【问题描述】:

我有以下难题。以下代码从向量池中获取一个向量,将向量绑定到矩阵,并对新矩阵执行函数并返回一个标量结果。

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])  
    #---------------------------------------------------------------------

我已经在需要的地方预先分配了,但真的需要摆脱循环,因为它太耗时了。我玩过各种想法,但无法想出办法。

我们将一如既往地欣然接受任何帮助。如果有什么我遗漏的,请告诉我。

【问题讨论】:

  • 很抱歉,但最后的大括号还没有打印出来,请放心,它是存在的!我还应该补充一点,在每次迭代时,都会向矩阵添加一个新向量,并将函数应用于新矩阵
  • 我也看过 do.call 函数,但看不到它如何应用于这个问题
  • 请添加足够有代表性的数据样本(nXtrXcalnC、...),以便其他人可以运行您的代码并深入研究问题。
  • 当然,我会尽快整理一些
  • 好的,您应该可以在对象上使用dput() 并将输出复制并粘贴到您的问题中。

标签: r loops matrix vector rbind


【解决方案1】:

摆脱for 循环不会自动使事情变得更快。您可以对代码进行的最大更改是尽可能避免计算solvesolve 的计算量非常大。

我没有尝试确保这没有错误,因为您没有提供示例数据。但是您可以遵循一般的想法:不要在每个循环中都执行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)

【讨论】:

  • 非常感谢!我会看一下并与当前结果进行比较,也会发布时间
  • 除非我遗漏了什么,否则此代码将无法正常工作,因为 first.solve 不是常量,因为 K2 需要使用 Xcal.i 进行更新
  • 抱歉,代码需要重新格式化,我会尽快输入
  • 对。我更正了代码。如果您提供了少量样本输入数据,则很容易检查是否存在错误。或者一些代码来生成示例输入。
  • 干杯 nograpes,下次我会提交一些数据。非常感谢您的时间
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多