2012-07-08 177 views
2

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

我的矩阵初始设置值介于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 
} 

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

编辑:从答案结果如下:

Results from the answers below:

+0

请提供最小的示例数据集,带'm','lb'和'ub'。如果没有这个,我只是建议你看看''sweep'。 – 2012-07-08 04:30:38

+0

谢谢,我编辑了这个问题。 – Fernando 2012-07-08 05:11:21

+0

我觉得你填写'lbM'和'rangeM'的方式有问题。你应该使用'rep(...,each = nobs)'还是'matrix(...,byrow = TRUE)'? – flodel 2012-07-08 05:20:51

回答

1

您可以使用双转:

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

这看起来不错,谢谢! – Fernando 2012-07-08 05:41:41

1

下面是使用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 
+0

谢谢,结果与我上面的第一个解决方案相匹配......现在我不知道哪一个更有效 - 我会尝试一些测试! – Fernando 2012-07-08 05:33:51

+0

我不会为它出汗。在我看来,flodel的解决方案更聪明,更优雅,而我的*可能更容易看到,并很快看到它的作用和方式。 – 2012-07-08 05:50:12

+0

我用2000x10矩阵运行了一些测试,每个功能运行1000次。结果(用户,系统,经过):** sweepFunction ** =(1.544,0.860,2.382)。 ** matrixMultFunction ** =(1.227,0.772,1.981)。 ** transposeFunction ** =(0.658,0.955,1.598) - 再次感谢 – Fernando 2012-07-08 06:04:27