2017-07-29 3 views
0

Ich erhalte einen Fehler mit Repmat. Meine Matlab Version ist 2017a. "Das angeforderte Array 3711450x2726 (75,4 GB) überschreitet die maximale Array-Größe ..." Zuerst ein Kontext.Netzwerkbildung und große Arrays in Matlab Optimierung

Ich habe eine Adjazenz-Matrix von sozialen Netzwerkdaten nennen es D. D ist 2725x2725 mit 1s bezeichnet eine Verbindung zwischen Agenten i und j und 0s sonst. Ich habe eine Funktion und Unterfunktionen für ein Netzwerkbildungsmodell bereitgestellt. Es gibt K Regressoren (x Variablen). Das Modell erfordert die Bildung einer dyadenspezifischen Regressormatrix W, die W = 0,5 N (N - 1) x K ist. In meinen Daten ist dies 3711450 x K. Zunächst wähle ich nur eine x Variable, also K = 1.

In der Hauptfunktion gibt es zwei Schritte. Der erste Schritt berechnet das gemeinsame MLE aus einem Logit. Ich habe ein Problem in der zweiten Schritt Berechnung der Varianz Kovarianz Matrix mit Array-Größe. Innerhalb dieses Schritts gibt es eine Berechnung, die eine 3711450 x n (2725) -Matrix unter Verwendung von repmat erzeugt.

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

exp_Xbeta ist 3.711.450 x K und X eine sparse 3.711.450 x 2725 Matrix mit Bytes = 178.171.416 der Klasse Doppel. Der Fehler tritt bei INFO auf.

Ich habe versucht, X in eine hohe Matrix zu konvertieren, aber bisher keine Freude. Ich habe versucht, spärlich zur INFO-Zeile hinzuzufügen, aber wieder keine Freude. Hat jemand irgendwelche Ideen, kurz zu einem Cluster zu gehen oder mehr RAM zu bekommen? Könnte ich irgendwie X von einer dünn besetzten Matrix in eine vollständige Matrix innerhalb eines Datenspeichers konvertieren und dann den Datenspeicher aufrufen, indem ich groß benutze? Ich bin nicht in der Lage, herauszufinden, wie das geht, wenn es möglich ist.

Sobald INFO als Array aufgebaut ist, wird es später in einer der Unterfunktionen verwendet. Also muss es aufrufbar sein. Falls Sie neugierig sind, ist INFO die Matrix der zweiten Ableitung.

Antwort

0

Ich habe festgestellt, dass die Erstellung der INFO-Matrix auf einmal zu viel für meine Speicherbeschränkungen war. Ich habe die Schritte aufgeteilt, aber immer noch waren Repmat und nachfolgende Schritte ein Problem. Jetzt habe ich mich daran gemacht, die INFO-Matrix Schritt für Schritt aufzubauen, während ich nie mehr als exp_Xbeta, X und zwei Vektoren im Speicher habe. Ersetzen der Konstruktion von INFO mit

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 

hat die Speicheranforderung fallengelassen, obwohl es langsam ist, und die Dinge scheinen zu funktionieren. Für alle Interessierten ist unten ein kleines Beispiel, das den Punkt veranschaulicht.

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