刚刚群里有人提问,“请教个问题,有两个矩阵A和B,A矩阵n行2列,2列分别代表经度和纬度,B矩阵相同(行数不同,A有1万行,B有350万行),需要找出B矩阵中每一行数据,在A矩阵中距离最近的行号,该采用什么方法。”
乍一看,如果矩阵A和矩阵B是同型矩阵的话,那么可以直接对矩阵A和矩阵B做减法,然后再计算距离。但是,在A和B非同型矩阵的情况下。貌似只能用循环的方式解决了。当然,用lapply()
等泛函应该也可以。我想到一种解法,不过十分繁琐,而且用到了最不推荐的循环方式。鉴于目前没有想到什么更好的办法,姑且把目前的想法记下来。
由于提问者给的矩阵维度过大,算完估计黄花菜都凉了。所以我把数据维度缩小几个数量级,以下是代码。
|
|
|
|
|
|
|
|
|
|
|
|
上面的代码运行效率其实是很低的,因为每经过一轮迭代,R就要为distance
和nm
两个向量重新分配内存。这里为什么不用distance <- numeric(nrow(dfA) * nrow(dfB))
这种循环呢?可以看到,distance
的长度是矩阵A和矩阵B行数的积,但是在for
循环中,索引向量只有i
和j
,i
和j
均小于distance
的长度。这就导致了循环无法继续。
|
|
|
|
解决上面的问题,一共写了接近30行的代码。可以说已经是很繁琐了。但现在想想也就这一个办法(⊙o⊙)…。如果以后再想到其他的更简单的做法,再重写一篇博客。