如何在matlab

时间:2017-06-27 06:34:46

标签: matlab

我必须在我目前的研究项目中计算具有大矩阵的四阶累积量。 以下是我的代码的一部分。

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);

实验性分布式计算集群由两台计算机组成。我发现在三重循环期间两台计算机之间几乎没有数据通信。所以我认为计算可以通过序列以较小的比例完成,而不是将整个矩阵加载到内存中。换句话说,大规模矩阵的计算可以等于较小矩阵的组合。但在搜索互联网几天后,我仍然不知道。

有人对这个问题有一些建议或意见吗?

1 个答案:

答案 0 :(得分:0)

你的矩阵似乎有很多零,你试过使用稀疏矩阵吗?当你想节省内存时,它会有很大的帮助。