当函数使用元素在矩阵中的位置时,在矩阵上使用 mapply

Using mapply over a matrix when the function makes use of elemets' location in the matrix

我想使用 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)))
    }

像这样对行和列索引尝试 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) or array(v, dim(mat)) or 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]))