【发布时间】:2016-03-24 11:08:26
【问题描述】:
我有两个向量 x 和 cen。假设x 的长度为10,cen 的长度为3。我想找到x 和cen 的各个点之间的欧几里得距离。
欧式距离函数定义为:euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))
我看到 sapply 像这样与否定 "-" 运算符一起使用:
> x
[1] 23 4 65 8 9 23 90 76 55 7
> cen
[1] 23 4 65
> sapply(x,"-",cen)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 -19 42 -15 -14 0 67 53 32 -16
[2,] 19 0 61 4 5 19 86 72 51 3
[3,] -42 -61 0 -57 -56 -42 25 11 -10 -58
这里cen 向量中的每个值都在整个x 向量上运行。
但是当我尝试使用 euc.dist 函数而不是 "-" 时,我只能得到一个向量作为输出,而不是一个 3x10 矩阵。
> sapply(x,"euc.dist",cen)
[1] 46.09772 63.89053 74.06079 59.07622 57.93962 46.09772 111.84811 90.07774 61.03278 60.24118
发生这种情况的任何原因?我是否需要以不同的方式定义 euc.dist 函数?任何帮助,将不胜感激。提前致谢。
【问题讨论】:
-
您的代码基本上是这样做的:
sapply(1:length(x),function(m) euc.dist(x[m],cen))它将euc.dist函数应用于每个x元素到整个向量cen。一种解决方案是排列您的x和cen向量,以便将相应的x1和x2值插入euc.dist。 -
@road_to_quantdom:啊,我知道现在发生了什么。对不起,我不明白你所说的“线
x和cen向量”是什么意思 -
查看
outer函数,例如outer(cen,x,"-") -
@MaratTalipov
outer确实适用于"-"操作,但outer(cen,x,"euc.dist")给出以下错误 -Error in outer(cen, x, euc.dist) : dims [product 30] do not match the length of object [1]
标签: r sapply euclidean-distance