首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >素食者中的R大距离矩阵

素食者中的R大距离矩阵
EN

Stack Overflow用户
提问于 2015-12-14 21:41:58
回答 1查看 1.5K关注 0票数 4

我在一台拥有128 GB内存的机器上运行R3.2.3。我有一个123028行x 168列的大矩阵。我想在R中使用分层聚类算法,因此在这样做之前,我尝试用Bray方法在纯素包中使用vegdist()函数在R中创建一个距离矩阵。我得到了一个内存分配错误:

代码语言:javascript
复制
df <- as.data.frame(matrix(rnorm(20668704), nrow = 123028))
library(vegan)
mydist <- vegdist(df)

素食主义错误(Df):.Fortran不支持长向量(参数4)

如果我使用pryr包来找出距离矩阵需要多少内存,我就会发现需要121 GB,这比我所拥有的RAM要少。

代码语言:javascript
复制
library(pryr)
mem_change(x <- 1:123028^2)

121 GB

我知道R中的单个对象曾经有20亿个值的限制,但我认为这个限制在最近版本的R中消失了,还有另一个我不知道的记忆限制吗?

底线是,我想知道:我能对这个错误做些什么呢?这真的是因为记忆的限制,还是我错了?我想留在R中,在k-均值之外使用聚类算法,所以我需要计算一个距离矩阵。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-14 22:20:27

R可以很好地处理长向量,但距离矩阵的计算似乎是用C或Fortran实现的,并且使用.C.Fortran与R接口,后者不接受长向量(即长度大于2^32 -1的向量)。请参阅docs 这里,其中声明:

请注意,.C和.Fortran接口不接受长向量,因此必须使用.Call (或类似的)。

看看源代码vegdist()函数,它看起来就像你的矩阵被转换成一个向量,然后传递给一个用C实现的函数来计算距离。相关代码行:

代码语言:javascript
复制
d <- .C("veg_distance", x = as.double(x), nr = N, nc = ncol(x), 
        d = double(N * (N - 1)/2), diag = as.integer(FALSE), 
        method = as.integer(method), NAOK = na.rm, PACKAGE = "vegan")$d

这就是你的问题所在。当您的矩阵被转换为向量时,它会变成一个长向量,.C不支持它。您将不得不寻找一个不同的包来计算您的距离矩阵(或者自己实现一个)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34277125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档