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