1

我想在矩阵上应用矩阵中每个值的值、行索引和列索引的函数,并获得转换后的矩阵。例如

mat<-matrix(c(1,2,3,4),2,2)    
mat
     [,1] [,2]
[1,]    1    3
[2,]    2    4

f<-function(x,i,j){x+i+j}
mat2 <- my.apply(f,mat)
mat2
     [,1] [,2]
[1,]    3    6
[2,]    5    8

上面的示例仅用于说明目的,f可能要复杂得多。

apply由于处理额外参数的方式,无法完成这项工作。

apply(mat,1:2,f,seq_along(mat[,1]),seq_along(mat[1,]))
, , 1

     [,1] [,2]
[1,]    3    4
[2,]    5    6

, , 2

     [,1] [,2]
[1,]    5    6
[2,]    7    8

我找不到与lapply家人的任何一种方式。循环可以for完成这项工作,但它既不高效也不优雅。有什么建议么?谢谢

4

2 回答 2

10

尝试mapply

mat <- matrix(c(1, 2, 3, 4), 2, 2)
mat
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4


matrix(mapply(function(x, i, j) x + i + j, mat, row(mat), col(mat)), nrow = nrow(mat))
##      [,1] [,2]
## [1,]    3    6
## [2,]    5    8
于 2013-03-08T05:16:41.813 回答
0

这是 apply 的一个丑陋用法,只是为了一些快速而肮脏的工作。诀窍是为行(或列)索引添加额外的列(或行)。

mat <- matrix(c(1, 2, 3, 4), 2, 2)
t(apply(cbind(mat, 1:nrow(mat)), 1, function(x){x[1:ncol(mat)] + 1:ncol(mat) + x[ncol(mat)+1]}))
##     [,1] [,2]
##[1,]    3    5
##[2,]    6    8

如果你已经有一个函数f(x, i, j),你也可以尝试:

apply(cbind(mat, 1:nrow(mat)), 1, function(x){a = numeric(); for(j in 1:ncol(mat)){a[j] = f(x[j], x[ncol(mat)+1], j)}; a})
于 2013-03-08T05:52:49.887 回答