我使用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是第二个导数矩阵。
答案 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