Поскольку версия 3 R поддерживает длинные векторы. Длинный вектор индексируется double
. Длинный вектор может быть базой для матрицы или более чем 2-мерной матрицы, если каждый размер достаточно мал, чтобы быть проиндексированным integer
. Длинные векторы не могут быть переданы в собственный код через .C
и .Fortran
. Сообщение об ошибке, которое вы получаете, связано с тем, что длинный вектор передается через .C
.
Длинные векторы могут быть переданы через .Call
. Таким образом, до тех пор, пока собственный код glmnet может поддерживать длинные векторы (64-разрядные индексы) или может быть изменен/скомпилирован для его поддержки, нужно будет только изменить интерфейс между R и собственным кодом glmnet. Вы можете сделать это вручную на C, и для этой задачи также есть новый пакет с именем dotCall64
. Часть изменения интерфейса решает, когда копировать аргументы - .C/.Fortran превентивно копирует, но вы не хотите делать это без необходимости с большими структурами данных.
Я думаю, что трудность изменения собственного кода glmnet для поддержки 64-битных индексов зависит от фактического кода (который я только смотрел, но не работал). Легко переключить все целые числа (или явно или неявно 32-битные целые числа) в коде Fortran на 64-разрядные. Проблемы возникают, когда некоторые целые числа должны оставаться 32 бит, и это произойдет, например. для целых векторов, переданных из/в R-код, поскольку R использует 32-битные целые числа (даже в длинных векторах). В glmnet есть такие целые векторы. Насколько сложна модификация, тогда зависит от того, насколько чистым является исходный код Fortran (например, если он использует отдельные целочисленные переменные для индексирования и доступа к значениям целых массивов и т. Д.).
Экспериментальные реализации подмножеств R, как и Riposte, не помогут.
Во время вашего кода вы выполняете подмножество матрицы? Возможно, я ошибаюсь, но вы не можете выполнить подмножество матрицы, если в матрице содержится более 36 миллиардов элементов. В этом случае вы должны подмножить матрицу так, как если бы это был огромный атомный вектор (что на самом деле это потому, что матрица - это всего лишь vecotr с атрибутом dimesion). – SabDeM
В моем коде я использую файл с поддержкой bigmatrix, чтобы избежать этих проблем, но когда я запускаю glmnet, я должен передать его как R-матрицу следующим образом: 'theMatrix [,]'. – Danny
Привет, Дэнни. Мой комментарий напрямую не связан с вопросом, но mb это поможет. Взгляните на пакет pirls от Michael Kane - https://github.com/kaneplusplus/pirls. Мб этот решатель работает с длинными векторами. –