我必须在我目前的研究项目中计算具有大矩阵的四阶累积量。 以下是我的代码的一部分。
N=zeros((Kse*Ksf*Ksr)^2);
for k=1:Ke % Ke=3
for i=1:Kr % Kr=3
for j=1:Kf % Kf=1;
Mat=Xb(k:k+Kse-1,i:i+Ksr-1,j:j+Ksf-1); % size of Xb: (Ke+Kse-1)
% *(Kr+Ksr-1)*(Kf+Ksf-1)
Mat_vec=Mat(:);
snapshot_number=70;
Mat_kr=kron(Mat_vec,conj(Mat_vec));
N=N+Mat_kr*Mat_kr'/snapshot_number;
N=N-Mat_kr*Mat_kr'/snapshot_number.^2;
temp=Mat_vec*Mat_vec'/snapshot_number;
N=N-kron(temp,conj(temp));
end
end
end
在Kse = Ksr = 5和Ksf = 9的条件下,运行内存大约为200GB。 N的大小是50625 * 50625。我的可用服务器的最大内存为250GB。关键限制是记忆。所以我不能再增加Kse,Ksr和Ksf的参数了。我的目标是设置Kse = Ksr = Ksf = 11.
所以我想到了matlab分布式计算。
首先,我将参数缩小为Kse = 3,Ksr = 5和Ksf = 8仅用于测试。我将代码修改为以下editon:
myPool=parpool();
Xb_dis=distributed(Xb);
N_dis=distributed(zeros((Kse*Ksf*Ksr)^2));
for k=1:Ke % Ke=3
for i=1:Kr % Kr=3
for j=1:Kf % Kf=1;
Mat_dis=Xb_dis(k:k+Kse-1,i:i+Ksr-1,j:j+Ksf-1);
Mat_vec_dis=Mat_dis(:);
snapshot_number=70;
Mat_kr_dis=kron(Mat_vec_dis,conj(Mat_vec_dis));
N_dis=N_dis+Mat_kr_dis*Mat_kr_dis'/snapshot_number;
N_dis=N_dis-Mat_kr_dis*Mat_kr_dis'/snapshot_number.^2;
temp_dis=Mat_vec_dis*Mat_vec_dis'/snapshot_number;
N_dis=N_dis-kron(temp_dis,conj(temp_dis));
end
end
end
N=gather(N_dis);
实验性分布式计算集群由两台计算机组成。我发现在三重循环期间两台计算机之间几乎没有数据通信。所以我认为计算可以通过序列以较小的比例完成,而不是将整个矩阵加载到内存中。换句话说,大规模矩阵的计算可以等于较小矩阵的组合。但在搜索互联网几天后,我仍然不知道。
有人对这个问题有一些建议或意见吗?
答案 0 :(得分:0)
你的矩阵似乎有很多零,你试过使用稀疏矩阵吗?当你想节省内存时,它会有很大的帮助。