也许我还没有理解数组的外部产品

时间:2017-11-07 22:48:19

标签: 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)

    J_1 J_2
I_1   1   2
I_2   2   4
I_3   3   6

明确地给一个函数,比如,连接向量的元素,这就是我得到的,

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作为两组位置向量的索引,为了计算向量之间的距离,这个想法失败了,如下所示,

两组向量:

vi <- data.frame(x=c(3,1,0), y=c(2,1,0)) # three position vectors
vj <- data.frame(x=c(7,1), y=c(5,1))     # two position vectors
vi;vj

  x y
1 3 2
2 1 1
3 0 0
  x y
1 7 5
2 1 1

距离函数

计算两点之间距离的函数:

distk <- function(p,p0) { # two point distance
    sqrt(sum((p0-p)^2))
}

例如,要计算集合1的点3与集合2的点1之间的距离:

distk(vi[3,], vj[1,])

[1] 8.602325

错误

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

outer(ii, jj, function(i,j) distk(vi[i,], vj[j,]))
  

dim(robj)中的错误&lt; - c(dX,dY):dims [product 6]与之不一致   对象[1]长度

问题

我在这里缺少什么吗?或许,我还没有完全理解外部产品......

1 个答案:

答案 0 :(得分:1)

解决方案

joran评论之后,我根据之前的 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)
}

将此功能与 outer()结合使用,我得到了理想的结果:

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