溝端 浩平 / Kohei Mizobata
MATLAB Memo

5. 並列計算(parfor)

Parallel Computing Toolbox を使った parfor による並列計算のメモです。 計算そのものは簡単に並列化できても、図の保存では少し工夫が必要になります。 旧メモで書いていた回避策を、そのまま整理しています。

parfor parpool Parallel Computing Toolbox saveas fig jpeg

メモ

旧ページでは、parfor ループ内で直接 JPEG 保存すると 低解像度になってしまう問題を扱っています。

回避策として、まず .fig 形式で保存し、 後から別ループで JPEG に変換する方法を使っています。

注意点

※ 要 Parallel Computing Toolbox
旧メモでは、どうしても parfor ループ内でダイレクトに jpg に落とすことができない、 という点が最大の注意事項として挙げました。

parfor での並列処理

%---------------------------------------------------------
% parforループで並列処理
%---------------------------------------------------------

parpool(6); % ← ワーカーの数を指定
parfor k=1:length(fl); % <----- 変数 "fl" にファイルリストが入っているとする
  :
  :
  [parforループ内である変数 X,Y,Z を計算したとする]
  [m_map でマッピングしたとする]
  :
  :
  saveas(gcf, '*****.fig', 'fig'); % ← マッピングした図を fig 形式で保存
  parsave(ofl,X,Y,Z); % ← 以下に示す新規の関数 parsave を用意しておく
  :
  :
end

delete(gcp); % matlabpool にさよなら

fig から jpg へ変換

旧メモでは、なぜか別プログラムにしないと動かない、とコメントされています。 まず並列ループで .fig を保存し、その後に順次 JPEG へ変換します。

%---------------------------------------------------------
% fig形式からjpgへ変換
%---------------------------------------------------------

for k=1:length(fl)
  hoge=fileList{k};
  oflj=[hoge(1:26),'.jpg'];
  oflf=[hoge(1:26),'.fig'];

  uiopen(oflf,1);              % <--------- parfor ループで作った *.fig ファイルを開く
  print('-djpeg','-r200',oflj); % <------ jpg 形式で保存
  delete oflf;                 % <------ fig ファイルを削除
  close all;
end

補助関数 parsave

並列ループで変数を保存するために、別関数として parsave を用意します。

function parsave(fname,x,y,z)
  save(fname,'x','y','z')
end