2017-11-19 4 views
1

でのparforのフォルダ内のファイルを.MATロードするためにどのように私はは、MATLAB

B=load('dataB.mat'); % B is a 1600*100 matrix stored as 'dataB.mat' in the local folder 
simN=100; 
cof=cell(1,simN); 
se=cell(1,simN); 
parfor s=1:simN 
    [estimates, SE]=fct(0.5,[0.1,0.8,10]',B(:,s)); 
    cof{s}=estimates'; 
    se{s}=SE'; 
end 

しかし次のコードをMATLABでのparforループを実行したい、コードが動作しないように見える - 警告がない、それは出力なしで永遠に実行している - 私はループを終了し、関数 'fct'に決して入力していないことがわかった。 MATLABの並列計算で 'dataB.mat'のような外部データを読み込む方法について、どんな助力がありますか?私は私のコンソール上でこれを入力した場合

+0

コードに間違いはありません。それはちょうど本当に長い時間がかかっている可能性があります。並列計算を行う場合、MATLABは必要なすべてのデータを各作業者に送信する必要があります。この場合、「B」はすべての作業者にコピーする必要があります。 'B'が非常に大きい場合、これは大きな遅延を引き起こすことがあり、通常の' for'ループより時間がかかることがよくあります。 – jodag

答えて

1

は:

rand(1600,100) 

をして、私はdataB.matとして私の現在のワークスペースを保存するには、次のコマンド:

B = load('dataB.mat'); 

は私にansフィールドを含む1 1によって構造体をもたらします1600×100のダブルマトリックスとして。したがって、アプリケーションの各ループでは、fctを呼び出す前にBの列を抽出する必要があります(抽出された列は呼び出しの3番目の引数になります。渡す前に定義する必要があります)。 parforループを続行する前に、B変数の構成がブレークポイントでチェックされていませんでした。

また、新しいMatlabインスタンスで最初にparforループを実行すると、Matlabエンジンはすべてのワーカーをインスタンス化する必要があります...これには非常に時間がかかることがあります。辛抱強くして、最終的に2回目のテストを実行して、作業者がインスタンス化されたことが確実になったら問題が解決しないかどうかを確認します。

これらが原因でない場合は、標準ループ(の代わりにparfor)を実行し、繰り返しの最初の行にブレークポイントを設定することをお勧めします。これにより、問題を非常に迅速に見つけ出すのに役立ちます。