0

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

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
4

2 回答 2

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))
}
于 2012-04-16T20:20:03.783 回答
1

这会起作用:

func <- function (t,alpha) exp(-rep(t,7) * sapply(1:7,rep,length(t)) * alpha)
于 2012-04-16T20:12:08.760 回答