使用外部应用函数将两个矩阵的列作为感兴趣的元素

kal*_*alu 6 r

考虑矩阵drwith dim(d) = J x Ddim(r) = J x R.让fun(a,b)成为一个函数,它接受两个相同长度的向量并返回一些数字.
我想把列的d和列r分别作为我感兴趣的单位,并适用outer于它们.

下面的代码创建的列的列表来完成这个dr,然后同时使用outersapply:

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]]) })} )
Run Code Online (Sandbox Code Playgroud)

代码做我想要的并且相对有效,但是笨拙且不清楚.有没有更好的方法来实现我想要达到的目标?

Pra*_*ani 10

你很近.如本相关问题所述,您只需Vectorize()要将Fun()函数转换为矢量化版本的功能:

VecFun <- Vectorize( Fun )
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做:

outer(d.cols, r.cols, VecFun )
Run Code Online (Sandbox Code Playgroud)

例如,如果你定义

Fun <- function(a,b) sum(a+b)
Run Code Online (Sandbox Code Playgroud)

r,d矩阵定义如下:

J <- 5
D <- 3
R <- 4

d <- matrix( 1:(J*D), J, D)
r <- matrix( 1:(J*R), J, R)
Run Code Online (Sandbox Code Playgroud)

然后你得到这个:

> 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
Run Code Online (Sandbox Code Playgroud)