由於版本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這個求解器適用於長載體。 –