【发布时间】: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)。这会有所帮助。