当函数使用元素在矩阵中的位置时,在矩阵上使用 mapply
Using mapply over a matrix when the function makes use of elemets' location in the matrix
我想使用 mapply
将 fun
应用于矩阵的所有元素。当要应用的函数使用矩阵中每个元素的位置时,我不确定如何使用 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]))
我想使用 mapply
将 fun
应用于矩阵的所有元素。当要应用的函数使用矩阵中每个元素的位置时,我不确定如何使用 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]))