如何存储一个向量的向量

4
我正在尝试编写一个函数,用于确定x(一个点)和y(n个点的集合)之间的欧几里得距离。我应该如何将y传递给函数?到目前为止,我使用了这样的矩阵:
     [,1] [,2] [,3]
[1,]    0    2    1
[2,]    1    1    1

需要将(0,2,1)和(1,1,1)这两个点传递给该函数。

然而,当我将x作为普通的(列)向量传递时,在函数中两个变量不匹配。 我要么必须转置x或y,或以其他方式保存向量的向量。

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


我会创建一个包含你想要计算距离的点的组合的列表。将其传递给应用函数,然后从那里开始工作。 - Roman Luštrik
2个回答

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)

谢谢!如果我想让这个函数处理n维点,我该怎么做? - Alexander Engelhardt
这需要进行一次转置才能使用回收规则 sqrt(colSums((t(y)-x)^2)) - mbq

0

使用margin参数=1的apply函数似乎是最明显的选择:

> 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

对于更大的数据来说,这会非常慢。 - mbq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接