数组函数错误地重新排序输出列

时间:2012-04-16 19:44:18

标签: r vectorization

我在为输入向量执行下面的函数时发现结果不一致。当使用矢量化输入时,似乎重新排序输出列。有没有更好的方法来矢量化这个函数?

func <- function(t, alpha) { exp(matrix(-rep(t,7), ncol=7)*1:7*alpha) }

# correct    
rbind(func(3, 0.02), func(4, 0.02))

#incorrect
func(c(3, 4), 0.02)

> rbind(func(3, 0.02), func(4, 0.02))
          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
[1,] 0.9417645 0.8869204 0.8352702 0.7866279 0.7408182 0.6976763 0.6570468
[2,] 0.9231163 0.8521438 0.7866279 0.7261490 0.6703200 0.6187834 0.5712091

> func(c(3, 4), 0.02)
          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
[1,] 0.9417645 0.8352702 0.7408182 0.6570468 0.8869204 0.7866279 0.6976763
[2,] 0.8521438 0.7261490 0.6187834 0.9231163 0.7866279 0.6703200 0.5712091

2 个答案:

答案 0 :(得分:2)

结果没有任何不正确或不一致,只有您对R的回收规则的理解以及如何应用逐个元素的操作。 ; - )

R以列主要顺序(包括回收规则)存储和操作对象。您的示例仅在R为行主要订单时才有效。列主要排序意味着matrix(-rep(t,7), ncol=7)*1:7产生如下结果:

3*1 3*3 3*5 3*7 3*2 3*4 3*6
4*2 4*4 4*6 4*1 4*3 4*5 4*7

这是因为,在内部,矩阵只是具有dim属性的向量。你可以通过运行来看到这个:

> as.vector(matrix(-rep(3:4,7), ncol=7))
 [1] -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4

看看矢量的前两个元素是矩阵的第一列?这就是为什么当你乘以1:7时得到“不一致”的结果。你真的要求R做:

> (foo <- as.vector(matrix(-rep(3:4,7), ncol=7)) * 1:7)
 [1]  -3  -8  -9 -16 -15 -24 -21  -4  -6 -12 -12 -20 -18 -28

通过以下方式将其变回“矩阵”:

> dim(foo) <- c(2,7)
> foo
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   -3   -9  -15  -21   -6  -12  -18
[2,]   -8  -16  -24   -4  -12  -20  -28

如果您想利用回收规则,则需要从当前矩阵的转置开始。然后乘以1:7并转置该结果。说到转置,您可能希望避免命名变量t,因为这是转置函数的名称。

func <- function(v, alpha) {
  t(exp(matrix(-rep(v,7), nrow=7, byrow=TRUE)*1:7*alpha))
}

答案 1 :(得分:1)

这样可行:

func <- function (t,alpha) exp(-rep(t,7) * sapply(1:7,rep,length(t)) * alpha)