Matlab优化中的网络形成和大数组

时间:2017-07-29 15:59:25

标签: arrays matlab memory

我使用repmat收到错误。我的Matlab版本是2017a。 "请求3711450x2726(75.4GB)数组超出最大数组大小..."首先,一些背景。

我有社交网络数据的邻接矩阵称它为D. D是2725x2725,其中1s表示代理i和j之间的链接,否则为0。我已经为网络形成模型提供了函数和子函数。有K个回归量(x变量)。该模型需要形成一个dyad特定的回归矩阵W,其W = 0.5N(N-1)x K.在我的数据中,这是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 x K和X是稀疏的3711450 x 2725矩阵,Bytes = 178171416类double。错误发生在INFO。

我尝试过将X转换为高大的矩阵,但迄今为止没有任何乐趣。我已经尝试将稀疏添加到INFO行,但再次没有喜悦。任何人都有任何想法没有去集群或获得更多的内存?我可以以某种方式将X从稀疏矩阵转换为数据存储区内的完整矩阵,然后使用高位调用数据存储区吗?如果可能的话,我无法弄清楚如何做到这一点。

一旦INFO被构造为数组,它将在稍后的一个子函数中使用。所以,它需要是可调用的。如果你有点好奇,INFO是第二个导数矩阵。

1 个答案:

答案 0 :(得分:0)

我发现同时生成INFO矩阵对于我的内存限制来说太过分了。我分开了步骤,但仍然,repmat和后续步骤是一个问题。现在,我已经转向一次一步地构建INFO矩阵,而在内存中从不超过exp_Xbeta,X和两个向量。用

替换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

已经放弃了内存需求,虽然速度很慢,但似乎工作正常。对于任何有兴趣的人,下面是一个说明这一点的小例子。

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