我有两个向量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函数?任何帮助,将不胜感激。提前谢谢。
答案 0 :(得分:2)
您的euc.dist
函数没有矢量化,可以通过以下方式轻松测试:
euc.dist(x[1],cen)
[1] 46.09772
而你可能想要的是:
> Vectorize(euc.dist)(x[1],cen)
[1] 0 19 42
(使用?Vectorize
了解详情。)
因此,在您的情况下,一个简单的解决方案是:
> sapply(x,Vectorize(euc.dist),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
答案 1 :(得分:1)
datas <- expand.grid(x = x,cen = cen)
datas$euclid = apply(datas,1,function(rowval) euc.dist(rowval[1], rowval[2]))