2010-11-13 89 views
4

我想写一个函数来确定x(一点)和y(一组n点)之间的欧氏距离。 我应该如何将y传递给函数?到目前为止,我用这样一个矩阵:R:如何存储矢量向量

 [,1] [,2] [,3] 
[1,] 0 2 1 
[2,] 1 1 1 

这将通过点(0,2,1)和(1,1,1)到该函数。

但是,当我将x作为正常(列)向量传递时,这两个变量在函数中不匹配。 我要么必须转置x或y,要么以其他方式保存矢量矢量。

我的问题:在R中保存多个向量的标准方法是什么? (我的矩阵y)
它只是我的y转置或可能是一个列表或数据框?

+0

我会列出您想要计算距离的点的组合。你将它传递给一个应用函数并从那里开始工作。 – 2010-11-13 14:49:18

回答

1

没有标准的方法,所以你应该选择最有效的方法,另一方面取决于创建后这个向量向量的外观(最好是避免任何不必要的转换)和关于函数本身的速度。

我相信,列x,y和z的data.frame应该是不错的选择;距离函数将是相当简单和快速接着:

d<-function(x,y) sqrt((y$x-x[1])^2+(y$y-x[2])^2+(y$z-x[3])^2) 
+0

谢谢!如果我想要函数处理n维点,我该怎么做? – 2010-11-13 14:28:52

+0

这将需要一个转置来使用回收规则'sqrt(colSums((t(y)-x)^ 2))' – mbq 2010-11-13 21:08:47

0

同裕参数= 1的应用功能似乎是最明显的:

> x 
    [,1] [,2] [,3] 
[1,] 0 2 1 
[2,] 1 1 1 
> apply(x , 1, function(z) crossprod(z, 1:length(z)) ) 
[1] 7 6 
> 2*2+1*3 
[1] 7 
> 1*1+2*1+3*1 
[1] 6 

所以,如果你想要的距离然后平方根与选定点的差异的副产品似乎工作:

> apply(x , 1, function(z) sqrt(sum(crossprod(z -c(0,2,2), z-c(0,2,2))))) 
[1] 1.000000 1.732051 
+0

这对于较大的数据来说会很慢。 – mbq 2010-11-13 21:10:32