【问题标题】:How to use pointDistance with a very large vector如何将 pointDistance 与非常大的向量一起使用
【发布时间】:2017-01-19 09:39:56
【问题描述】:

我有一个大问题。

我有一个大栅格(行 = 180,列 = 480,单元数 = 86400) 起初我将它二值化(因此只有 1 和 0),然后我标记了簇。(1 并且相互连接的单元格得到相同的标签。)

现在我需要计算单元格之间的所有距离,而不是 0。 有很多安静,这是我的大问题。 我这样做是为了获取我感兴趣的单元格的坐标(获取不为 0 的单元格的位置(即单元格编号)):

V=getValues(label)
Vu=c(1:max(V))
pos=which(V %in% Vu)
XY=xyFromCell(label,pos)

这很好用。所以 XY 是一​​个矩阵,其中包含所有坐标(非 0 的单元格)。但现在我很挣扎。我需要计算所有这些坐标之间的距离。然后我必须将它们中的每一个放在 43 个距离箱之一中。有点像这样(只是一个例子):

0<x<0.2     bin 1
0.2<x<0.4   bin2

当我使用这个时:

pD=pointDistance(XY,lonlat=FALSE)

R 表示无法分配这种大小的向量。它变得太大了。 然后我想我可以这样做(创建一个空的数据框 df 或类似的东西,让函数 pointDistance 运行在 XY 的每个值上):

for (i in 1:nrow(XY))
{pD=PointDistance(XY,XY[i,],lonlat=FALSE)
pDbin=as.matrix(table(cut(pD,breaks=seq(0,8.6,by=0.2),Labels=1:43)))
df=cbind(df,pDbin)
df=apply(df,1,FUN=function(x) sum(x))}

当我尝试这个时它正在工作,例如XY 的前 50 个值。 但是当我将它用于整个 XY 矩阵时,它会花费太多时间。(有时这个 XY 矩阵包含 10000 个 xy 坐标) 有谁知道如何更快地做到这一点?

【问题讨论】:

  • 通过一次添加一列来增长数据框会很慢,因为 R 必须每次都进行复制。预先分配所需的空间。但也许你需要更多的内存,或者让你的问题更简单
  • 您的最后一行看起来可以替换为df=rowSums(df)。这会有所帮助。

标签: r distance raster


【解决方案1】:

我不知道这是否会很快奏效。我建议你试试这个: 假设您在每个单元格中有 dataframe 的值 01。要查找坐标,您只需编写以下代码:

cord_matrix <- which(dataframe == 1, arr.ind = TRUE)

现在,您将获得具有row 索引和column 索引的坐标矩阵。 要找到欧几里得距离,请使用 dist() 函数。通过它。它看起来像这样:

dist_vector <- dist(cord_matrix)

它将返回下三角矩阵。可以转化为向量/对称矩阵。现在您所要做的就是根据您的要求计算 bin。

让我知道这是否适用于特定的内存空间。

【讨论】:

  • 非常感谢。我试过你的建议,它确实工作得更快。但是当我想把这个“dist”转换成一个向量时,它仍然太大了。它说“无法分配这种大小的向量”。而且我不知道如何将“dist”值切割成bin而不将其转换为向量。
  • dist() 函数实际上是以向量格式返回输出。检查length(),您可以通过index 访问每个dist() 值。因此,我认为您不必将dist() 输出显式转换为向量,因为这可能会更多地消耗您的记忆。
  • 但我只是不知道如何用它计算垃圾箱。我整天都在努力做到这一点。但是 cut-function 不起作用,因为这个 dist() 太大了。
  • 尝试在将变量存储在硬盘驱动器后使用rm()删除变量,然后再开始使用dist值使用cut()。从工作区、坐标矩阵和其他东西中删除你的大矩阵。检查是否有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多