2017-07-29 7 views
0

repmatを使用するとエラーが発生します。私のMatlabバージョンは2017aです。 "要求された3711450x2726(75.4GB)配列が最大配列サイズを超えています..."まず、いくつかのコンテキスト。Matlab最適化におけるネットワーク形成と大規模配列

私はソーシャルネットワークデータの隣接行列を持っています.Dは2725x2725であり、1はエージェントiとjの間のリンクを示し、そうでない場合は0を示します。私は、ネットワーク形成モデルのための関数とサブ関数を提供されています。 K回帰(x変数)があります。このモデルでは、W = 0.5N(N-1)x Kのダイアド固有回帰行列Wを作成する必要があります。私のデータでは、これは3711450 x Kです。

主な機能には、2つのステップがあります。最初のステップは、ロジットからジョイントMLEを計算します。配列サイズの分散共分散行列の2番目の計算で問題があります。このステップでは、repmatを使用して3711450 x n(2725)の行列を作成する計算が行われます。

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

exp_Xbetaは3711450 X Kであり、Xは、二クラスのバイト= 178171416と疎3711450 X 2725行列です。エラーはINFOで発生します。

Xを高次の行列に変換しようとしましたが、これまでのところ喜びはありませんでした。私はINFO行にスパースを追加しようとしましたが、やはり喜びはありません。誰もがクラスタに行くか、より多くのラムを得るのに足りないアイディアを持っていますか?私は何とかXを疎な行列からデータストア内の完全な行列に変換してから、高値を使ってデータストアを呼び出すことができますか?私はそれが可能な場合、それを行う方法を把握することができませんでした。

INFOが配列として構築されると、それは後でサブ関数の1つで使用されます。だから、それは呼び出し可能である必要があります。好奇心が強い場合、INFOは二次微分行列です。

答えて

0

私は、INFO行列を一度に生成することは、私の記憶の制約のためにあまりにも多すぎることを発見しました。私はステップを分割しましたが、依然としてrepmatとそれに続くステップが問題でした。今、exp_Xbeta、X、および2つのベクトルをメモリに保持することはありませんが、INFO行列を一度に構築することに変わりました。

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 
関連する問題