2012-07-08 226 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