【问题标题】:R: how to store a vector of vectorsR:如何存储向量的向量
【发布时间】:2010-11-13 13:13:40
【问题描述】:

我正在尝试编写一个函数来确定 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 转置还是列表或数据框?

【问题讨论】:

  • 我会列出你想要计算距离的点组合。您将其传递给应用函数并从那里开始工作。

标签: r vector


【解决方案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 维点,我该怎么做?
  • 这需要一个换位才能使用回收规则sqrt(colSums((t(y)-x)^2))
【解决方案2】:

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

【讨论】:

  • 对于较大的数据,这会很慢。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2020-07-11
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多