2016-10-23 32 views
-1

我想使用mapplyfun應用於矩陣的所有元素。當要應用的函數使用矩陣中的每個元素的位置時,我不確定如何使用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

嘗試mapply通過行和列索引像這樣的地方fun是問題定義的功能。其結果是一個數字向量v

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

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

然後,它可以概括這樣sum(v)或再成形爲具有相同尺寸的矩陣作爲mat這樣的:replace(mat, TRUE, v)array(v, dim(mat))matrix(v, nrow(mat))0*mat+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]))