2016-11-22 2 views
1

最適化に基づいて行列のすべての値を効率的に解くコードを作成しようとしています。行列のすべての値を最適化する

(x - (1/((1/x) - sqrt(1/x))))^2 

が、私はこのタスクを達成いくつかのコードを書いたが、それはかなりではありません(またそれが速い):私は、方程式を最小限にxの値を見つけようとしています。

mSS <- function(x) 
{ 
    #Sum of squares for X and the transformation 
    (x - (1/((1/test_mat[rows, cols]) - sqrt(1/x))))^2 
} 

n = 151 
m = 50000 
test_mat = matrix(rnorm(n * m, mean = 0, sd = 1), n, m) 
trans_mat = matrix(data = NA, n, m) 

#Go through each row/col position in array, find value that minimizes mSS function 
for (cols in 1:ncol(test_mat)) { 
    for (rows in 1:nrow(test_mat)) { 
    trans_mat[rows, cols] = optimize(mSS, c(0, 3))$minimum 
    } 
} 

私は精神的にこれをより速くするための最良の方法を見つけようとしています。おそらく、いくつかのカスタム関数で適用するのがルートかもしれないと思っていたかもしれませんが、実行可能な解決策を理解するのが難しいです。正しい方向のポインタがあれば分かるはずです。

答えて

2

この試し:X){= xで、3 =上下= 0、MSS = F(最適化2、関数(:また `(適用test_mat、1のような何かができる

mSS<-function(x, a) 
{ 
    #Sum of squares for X and the transformation 
    (x-(1/((1/a)-sqrt(1/x))))^2 
} 
y <- as.numeric(test_mat) 
ty <- sapply(y, function(x) optimize(mSS,c(0,3),a=x)$minimum) 
trans_mat <- matrix(ty, nrow=nrow(test_mat)) 
+0

を)$ minimum}) '(同じ推論ですが、' sapply'と 'matrix'の代わりに' apply'を使用します) – etienne

+0

@ZheyuanLi:確かにベンチマークをしただけで、 'sapply'は高速です – etienne

関連する問題