我使用一些C ++代码从数据库中获取文本文件,并从Matrix
包创建一个dgcMatrix类型的稀疏矩阵。我第一次尝试构建一个具有2 ^ 31-1个非稀疏成员的矩阵,这意味着稀疏矩阵对象中的索引向量也必须长于该限制。不幸的是,向量似乎使用32位整数索引,Rcpp中的NumericVectors也是如此。
如果没有从头开始编写全新的数据类型,R是否为此提供了任何便利?我不认为我可以使用过于异国情调的解决方案,因为我需要glmnet
来识别结果对象。
答案 0 :(得分:3)
在最近的R版本中,向量由R_xlen_t
类型索引,在64位平台上为64位,在32位平台上仅为int
。
到目前为止,Rcpp仍在使用int
。我鼓励您在their issue list上申请该功能。这并不难,但需要有技能,时间和意愿的人的系统参与。 Rcpp11
的开发版使用正确的类型,也许他们可以将其用作模型。
但是请注意,即使R在64位平台上使用64位无符号整数,实际上也只限于double
类型可以处理的范围,如果你问的话R就会给你。对于向量的length
。 R没有可以原生代表的64位整数类型,因此当您询问向量的长度时,您可以获得int
或double
,具体取决于值。
答案 1 :(得分:3)
具有 spam64 扩展名的稀疏矩阵代数R软件包 spam 支持具有2 ^ 31-1个非零元素的稀疏矩阵。
一个简单的示例(需要约50 Gb内存并需要约5分钟才能运行):
## -- a regular 32-bit spam matrix
library(spam) # version 2.2-2
s <- spam(1:2^30)
summary(s)
## Matrix object of class 'spam' of dimension 1073741824x1,
## with 1073741824 (row-wise) nonzero elements.
## Density of the matrix is 100%.
## Class 'spam'
## -- a 64-bit spam matrix with 2^31 non-zero entries
library(spam64)
s <- cbind(s, s)
summary(s)
## Matrix object of class 'spam' of dimension 1073741824x2,
## with 2147483648 (row-wise) nonzero elements.
## Density of the matrix is 100%.
## Class 'spam'
## -- add zeros to make the dimension 2^31 x 2^31
pad(s) <- c(2^31, 2^31)
summary(s)
## Matrix object of class 'spam' of dimension 2147483648x2147483648,
## with 2147483648 (row-wise) nonzero elements.
## Density of the matrix is 4.66e-08%.
## Class 'spam'
此实现基于{strong> dotCall64 中提供的已编译代码的.C64()
R接口。
注意:垃圾邮件的 all 功能还不支持64位矩阵。
某些链接:
我是 dotCall64 和垃圾邮件的作者之一。