2016-10-23 3 views
-1

mapplyを使用して、マトリックスのすべての要素にfunを適用したいと考えています。私はmapplyの使用方法が、適用される関数が行列の各要素の位置を利用するときにはわかりません。関数が行列内のelemetsの位置を利用するときに、マトリックス上にmapplyを使用する

fun <- function(theta, mat, i, j){ 
    sum_nearby <- function(mat,i,j,dist){ 
     if (j - dist < 1) mat[i, j + dist] 
     else if (j + dist > ncol(mat)) mat[i, j - dist] 
     else mat[i, j - dist] + mat[i, j + dist] 
    } 
     g0 <- -2*mat[i,j] 
     g1 <- g0*sum_nearby(mat,i,j,1) 

     -log1p(exp(theta %*% c(g0, g1))) 
    } 

答えて

1

funが問題で定義された関数である。このような行と列のインデックス上mapplyを試してみてください。そして

# test inputs 
theta <- 1:2 
mat <- as.matrix(BOD) 

v <- mapply(fun, row(mat), col(mat), MoreArgs = list(theta = theta, mat = mat)) 

それはこのようmatと同じ次元を有する行列にこのsum(v)ように加算または再形成することができる:replace(mat, TRUE, v)又はarray(v, dim(mat))又はmatrix(v, nrow(mat))又は0*mat+v

注結果が数値ベクトルvであります:outerの代わりにmatと同じ次元の行列を返します。

outer(1:nrow(mat), 1:ncol(mat), Vectorize(function(i, j) fun(theta, mat, i, j))) 

又はapply上記mapply溶液のようにベクトルを返す:

apply(cbind(c(row(mat)), c(col(mat))), 1, function(ix) fun(theta, mat, ix[1], ix[2])) 
関連する問題