2017-07-29 39 views
0

我收到了一個使用repmat的錯誤。我的Matlab版本是2017年。 「請求的3711450x2726(75.4GB)數組超出了最大數組大小......」首先,有些上下文。Matlab優化中的網絡形成和大陣列

我有一個社交網絡數據的鄰接矩陣調用它D. D是2725x2725,其中1表示代理i和j之間的鏈接,否則爲0。我爲網絡編隊模型提供了一個功能和子功能。有K個迴歸因子(x個變量)。該模型需要形成W = 0.5N(N-1)×K的二元特定迴歸矩陣W.在我的數據中,這是3711450 x K.首先,我只選擇一個x變量,因此K = 1。

在主要功能中,有兩個步驟。第一步從logit中計算聯合MLE。在第二步計算具有數組大小的方差協方差矩陣時,我有一個問題。在這一步中,有一個計算使用repmat創建了一個3711450 x n(2725)矩陣。

INFO  = ((repmat((exp_Xbeta ./ (1+exp_Xbeta).^2),1,K) .* X)'*X); 

exp_Xbeta是3711450×K個和X是一個稀疏3711450 X 2725矩陣類雙字節= 178171416。 INFO發生錯誤。

我試過將X轉換成一個高矩陣,但迄今沒有喜悅。我已經嘗試在INFO行中添加稀疏信息,但再次沒有快樂。任何人有任何想法沒有去集羣或獲得更多的內存?我可以以某種方式將X從稀疏矩陣轉換爲數據存儲區內的完整矩陣,然後使用高位調用數據存儲區?如果可能,我一直無法弄清楚如何做到這一點。

一旦INFO被構造爲一個數組,它將在其後的子函數中使用。所以,它需要被調用。如果你很好奇,INFO是二階導數矩陣。

回答

0

我發現一次生成INFO矩陣對於我的內存限制太多了。我將步驟分開,但仍然是,repmat和後續步驟是個問題。現在,我已經轉向一次一步地構建INFO矩陣,而從未在內存中保存超過exp_Xbeta,X和兩個向量。與

for i = 1:d 
    s1_i = step1(:,1).*X(:,i); 
    s1_i = s1_i'; 
    for j = 1:d; 
     INFO(i,j) = s1_i*X(:,j); 
    end 
    clear s1_i; 
end 

更換INFO建設已降至對存儲器的要求,但其緩慢的,事情似乎工作。對於任何感興趣的人來說,下面是一個例子來說明這一點。

clear all 

N = 20 
n = 0.5*N*(N-1) 
exp_Xbeta = rand(n,1); 
X   = rand(n,N); 

step1  = (exp_Xbeta ./ (1+exp_Xbeta).^2); 
[c,d]  = size(X); 
INFO  = zeros(d,d); 

for i = 1:d 
    s1_i = step1(:,1).*X(:,i) 
    s1_i = s1_i' 
    for j = 1:d 
     INFO(i,j) = s1_i*X(:,j) 
    end 
    clear s1_i 
end 

K = 1 
INFO2 = ((repmat((exp_Xbeta ./ (1+exp_Xbeta).^2),1,K) .* X)'*X); 

% Methods produce equivalent matrices 
INFO 
INFO2