R 也许我还没有理解数组的外积 玩具示例

R 也许我还没有理解数组的外积 玩具示例,r,vector,R,Vector,我有两个简单的整数向量 ii <- 1:3 jj <- 1:2 names(ii) <-paste0("I_",ii) names(jj) <-paste0("J_",jj) ii;jj I_1 I_2 I_3 1 2 3 J_1 J_2 1 2 明确地给出一个函数,比如,连接向量的元素,这就是我得到的 outer(ii, jj, function(i,j) paste(i,j,sep = "-")) J_1 J_

我有两个简单的整数向量

ii <- 1:3
jj <- 1:2

names(ii) <-paste0("I_",ii)
names(jj) <-paste0("J_",jj)
ii;jj

I_1 I_2 I_3   
  1   2   3   
J_1 J_2   
  1   2
明确地给出一个函数,比如,连接向量的元素,这就是我得到的

outer(ii, jj, function(i,j) paste(i,j,sep = "-"))

    J_1   J_2  
I_1 "1-1" "1-2"
I_2 "2-1" "2-2"
I_3 "3-1" "3-2"
问题 然而,当我尝试更进一步时,使用ii和jj作为两组位置向量的索引,为了计算向量之间的距离,这个想法失败了,如下所示

两组向量: 错误 当我尝试使用外积,按照上面的逻辑,计算从集合1中的点到集合2中的点的距离时,我只得到一个错误:

outer(ii, jj, function(i,j) distk(vi[i,], vj[j,]))
dim(robj)解决方案中的错误 在评论之后,我根据前面的distk()函数介绍了距离函数的矢量化版本,如下所示

distv <- function(p,p0) { # vectorized version
    p <- if (is.null(dim(p))) as.data.frame(p) else as.data.frame(t(p))
    p0 <- if (is.null(dim(p0))) as.data.frame(p0) else as.data.frame(t(p0))
    mapply(distk, p, p0)
}

FUN
必须矢量化
outer
并不是一次计算一对
FUN
,而是将X和Y扩展到一个公共长度,然后调用
FUN
一次,并强制结果具有适当的维度。
distk <- function(p,p0) { # two point distance
    sqrt(sum((p0-p)^2))
}
distk(vi[3,], vj[1,])

[1] 8.602325
outer(ii, jj, function(i,j) distk(vi[i,], vj[j,]))
distv <- function(p,p0) { # vectorized version
    p <- if (is.null(dim(p))) as.data.frame(p) else as.data.frame(t(p))
    p0 <- if (is.null(dim(p0))) as.data.frame(p0) else as.data.frame(t(p0))
    mapply(distk, p, p0)
}
outer(ii, jj, function(i,j) distv(vi[i,], vj[j,]))

         J_1      J_2
I_1 5.000000 2.236068
I_2 7.211103 0.000000
I_3 8.602325 1.414214