1

mapply在两个矩阵上使用我的函数,但最终结果是一个向量。我试过使用SIMPLIFY = TRUE没有成功。

有没有办法让我以矩阵的形式得到我的结果而不必构造?

提前致谢。

> a=matrix(c(0,2, 0, 0, 1, 3, 0, 3, 2, 0, 3, 5, 0, 4, 0, 0),ncol=4)
> a
 [,1] [,2] [,3] [,4]
[1,]    0    1    2    0
[2,]    2    3    0    4
[3,]    0    0    3    0
[4,]    0    3    5    0


> ab=matrix(c(4,2, 0, 7, 1, 4, 5, 3, 2, 6, 3, 7, 1, 2, 1, 2),ncol=4)
> ab
 [,1] [,2] [,3] [,4]
[1,]    4    1    2    1
[2,]    2    4    6    2
[3,]    0    5    3    1
[4,]    7    3    7    2
> mapply(l0.0025,a,ab)
 [1] 3.9900 0.0000 0.0000 6.9825 0.0000 0.9975 4.9875 0.0000 
 [9] 0.0000 5.9850 0.0000 1.9950 0.9975 0.0050 0.9975 1.9950
l0.0025 <- function(x, y) { 
      if (x-y >= 0) {0.0025*(x-y)} else {-(1-0.0025)*(x-y)} 
}
4

1 回答 1

2

没有必要mapply。你得到你想要的:

l0.0025 <- function(x,y){
    tmp <- x-y
    tmp * ifelse(tmp>0,0.0025,-0.9975)        
}
> l0.0025(a,ab)
       [,1]   [,2]  [,3]   [,4]
[1,] 3.9900 0.0000 0.000 0.9975
[2,] 0.0000 0.9975 5.985 0.0050
[3,] 0.0000 4.9875 0.000 0.9975
[4,] 6.9825 0.0000 1.995 1.9950

您必须记住这ifelse()是获取条件的矢量化方式,并且 R 中的运算符以矢量化方式工作。因此,您可以以不需要类似循环的结构的方式构建您的计算。

如果要使用 mapply,还必须考虑到它将矩阵视为向量。这就是它不返回矩阵的原因。

于 2012-12-07T16:14:07.313 回答