【问题标题】:denormalize matrix in RR中的非规范化矩阵
【发布时间】:2012-07-08 04:08:22
【问题描述】:

我在 R 中有一个 N x K 矩阵,其中每一行是一个观察值,每一列是一个具有固定下限和上限的变量。

我的矩阵最初设置为 0 到 1 之间的值。反规范化此矩阵的最佳方法是什么?我正在使用以下功能:

denormalizeMult = function(m, lb, ub)
{
 nobs = nrow(m)
 nvars = ncol(m)
 lbDiag = diag(lb, ncol = nvars)
 rangeM = diag(ub - lb, ncol = nvars) 

 m%*%rangeM + matrix(rep(lb, nobs), nrow = nobs, byrow = TRUE)
}

 # Example:
 # 3 variables, 9 observations
 x = matrix(runif(3*9), ncol = 3)

 # to denormalize a variable xi, just do lb[i] + (ub[i] - lb[i])*xi
 # ranges for each variable
 lb = c(-1,-2,-3)
 ub = c(1,2,3)

第一个变量的范围是 -1 到 1,第二个变量的范围是 -2 到 2,依此类推... 另一种解决方案是:

   denormalize2 = function(population)
   {
     r = nrow(population)
     c = ncol(population)
     decm = matrix(rep(0, r*c), r, c)

     for(i in 1:r)
           decm[i,] = lb + (ub - lb) * population[i,]       
     decm
 }

有没有一种简单(更快)的方法来实现这一点? 谢谢!

编辑:以下答案的结果:

【问题讨论】:

  • 请提供最小示例数据集,包括mlbub。如果没有,我只是建议你看看?sweep
  • 谢谢,我已经编辑了问题。
  • 我觉得您填写lbMrangeM 的方式有问题。您应该使用rep(..., each = nobs) 还是matrix(..., byrow = TRUE)
  • 不管怎样,这个功能不起作用...我重新编辑了它,谢谢!

标签: r matrix vectorization denormalized


【解决方案1】:

您可以使用双重转置:

t(lb + t(x) * (ub - lb))

【讨论】:

    【解决方案2】:

    这是使用sweep()的解决方案:

    ## Example data
    x <- matrix(c(0,0.5,1), nrow=3, ncol=3)  # A better example for testing 
    lb = c(-1,-2,-3)
    ub = c(1,2,3)
    
    sweep(sweep(x, 2, ub-lb, FUN="*"), 2, lb, FUN="+")
    #      [,1] [,2] [,3]
    # [1,]   -1   -2   -3
    # [2,]    0    0    0
    # [3,]    1    2    3
    

    【讨论】:

    • 谢谢,结果与我上面的第一个解决方案相匹配......现在我不知道哪个更有效 - 我会尝试一些测试!
    • 我不会出汗的。在我看来,flodel 的解决方案更聪明、更优雅,而我的可能以后更容易查看并快速了解它的作用和方式。
    • 我用 2000x10 矩阵运行了一些测试,每个函数运行 1000 次。结果(用户、系统、经过):sweepFunction = (1.544, 0.860, 2.382)。 matrixMultFunction = (1.227, 0.772, 1.981)。 transposeFunction = (0.658, 0.955, 1.598) - 再次感谢
    • @Fernando -- 这是我之前评论的更正版本(使用n &lt;- nrow(x) 而不是n &lt;- ncol(x))。如果您追求的是速度,那么这应该是相当有竞争力的:n &lt;- nrow(x); x * rep(ub-lb, each=n) + rep(lb, each=n)。它应该比@flodel 更快,因为它避免了耗时的矩阵转置。 (顺便说一句,感谢您发现我之前的错误。)
    • 谢谢 - 我正在运行一个包含很多行的进化算法,这段代码会有很大帮助。我会用正确的版本发布一个新的测试!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2014-12-23
    • 2013-06-07
    相关资源
    最近更新 更多