由于版本3 R支持长向量。长向量由double
索引。只要每个维度足够小以便可由integer
索引,则长矩阵可以是矩阵或多于2维阵列的基础。长向量不能通过.C
和.Fortran
传递给本地代码。您收到的错误消息是因为一个长矢量正通过.C
传递。
长向量可以通过.Call
传递。所以,只要glmnet的本地代码可以支持长向量(64位索引)或者可以修改/编译以支持它,就只需修改R和glmnet的本地代码之间的接口即可。您可以在C中手动执行此操作,并且此任务还有一个名为dotCall64
的新程序包。修改接口的一部分是决定何时复制参数 - .C/.Fortran预防性复制,但您不希望在大型数据结构中进行不必要的操作。
我认为改变glmnet的本地代码以支持64位索引的难度取决于实际的代码(我只看过但从未使用过)。将Fortran代码中的所有整数(或显式或隐式32位整数)切换为64位很容易。当一些整数必须保持32位时会出现问题,这会发生,例如,对于从/到R代码传递的整数向量,因为R使用32位整数(即使在长向量中也是如此)。在glmnet中有这样的整数向量。修改的难度取决于原始Fortran代码的干净程度(例如,如果它使用单独的整数变量来索引和访问整型数组的值等)。
R的子集的实验性实现,如Riposte,将无济于事。
在您的代码中,您是否执行矩阵的子集化?我可能是错的,但如果矩阵有超过360亿个元素,则不能执行矩阵子集。在这种情况下,你必须将矩阵子集看作是一个巨大的原子向量(事实上它是因为矩阵只是一个具有dimesion属性的vecotr)。 – SabDeM
在整个我的代码中,我使用一个支持bigmatrix的文件来避免这些问题,但是当我运行glmnet时,我必须将它作为R矩阵传递,如下所示:'theMatrix [,]'。 – Danny
嗨Danny。我的评论与问题没有直接关系,但是它会有所帮助。看看Michael Kane的pirls包 - https://github.com/kaneplusplus/pirls。 Mb这个求解器适用于长载体。 –