考虑使用d
和r
的矩阵dim(d) = J x D
和dim(r) = J x R
。
让fun(a,b)成为一个函数,它接受两个相同长度的向量并返回一些数字
我想将d
和r
的列分别视为我感兴趣的单位,并将outer
应用于他们。
以下代码通过创建d
和r
列的列表,然后同时使用outer
和sapply
来实现此目的:
d.cols <- split(d, col(d))
r.cols <- split(r, col(r))
outer(d.cols, r.cols,
function(x,y) {
sapply(seq_along(x),
function(i) {
Fun(x[[i]], y[[i]]) })} )
代码做我想要的并且相对有效,但是笨拙且不清楚。有没有更好的方法来实现我想要的目标?
答案 0 :(得分:10)
你非常接近。正如this related question中所述,您只需Vectorize()
函数即可将Fun()
函数转换为矢量化版本:
VecFun <- Vectorize( Fun )
然后你就可以做到:
outer(d.cols, r.cols, VecFun )
E.g。如果你定义
Fun <- function(a,b) sum(a+b)
和r,d
矩阵的定义如下:
J <- 5
D <- 3
R <- 4
d <- matrix( 1:(J*D), J, D)
r <- matrix( 1:(J*R), J, R)
然后你明白了:
> outer(d.cols, r.cols, VecFun)
1 2 3 4
1 30 55 80 105
2 55 80 105 130
3 80 105 130 155