2017-03-01 17 views
0

私は午前中に研究をしてきたので、なぜこのコードが実行されないのか理解できません。MATLABのセル配列の問題を分類する "parfor"ループ

もともとコードは以下のとおりであった:

nSim = 100; 
nTs = 40; 
nRep = 10; 
m1 = NaN(nTs,nSim); 
meanM1 = NaN(nTs,nRep); 
delta = [1/400,1/400,-1/400]'; 
d = -0.05; 
dataQCell = cell(nSim*nRep,1); 
for jj=1:nSim*nRep 
    dataQCell{jj} = rand(3,nTs); 
end 

matlabpool('open',10) 
parfor ii=1:nRep 
    for jj=1:nSim 
    for tt=1:nTs 
     if tt>1 
     m1(tt,jj) = m1(tt-1,jj) + delta'* dataQCell{(ii-1)*nSim+jj,1}(1:3,tt)+d; 
     else 
     m1(tt,jj) = delta'* dataQCell{(ii-1)*nSim+jj,1}(1:3,tt) + d; 
     end 
    end 
    end 

    meanM1(tt,ii) = mean(m1,2); 
end 
matlabpool close force 

私の初期の思想は、犯人がdataQCellの指標として

m1(tt,jj) = m1(tt-1,jj) + deltaQ'* dataQCell{(ii-1)*nSim+jj,1}(1:3,tt) + d; 

が指数(iijj)の関数であるということでした。

メモ私はmeanM1行をコメントアウトしましたが、私はまだ同じエラーが発生します。ソリューションで

私の最初の試みは、コード

nSim = 100; 
nTs = 40; 
nRep = 10; 
m1 = NaN(nTs,nSim); 
meanM1 = NaN(nTs,nRep); 
deltaQ = [1/400,1/400,-1/400]'; 
d = -0.05; 

dataQCell = cell(nSim*nRep,1); 
for jj=1:nSim*nRep 
    dataQCell{jj} = rand(3,nTs); 
end 

dataRepCell = cell(nRep,1); 
for ii=1:nRep 
    dataRepCell{ii} = dataQCell{(ii-1)*nSim+1:ii*nSim}; 
end 

matlabpool('open',10) 
parfor ii=1:nRep 
    for jj=1:nSim 
    for tt=1:nTs 
     if tt>1 
     m1(tt,jj) = m1(tt-1,jj) + deltaQ'* dataRepCell{ii}{jj}(1:3,tt)+d; 
     else 
     m1(tt,jj) = deltaQ'* dataRepCell{ii}{jj}(1:3,tt) + d; 
     end 
    end 
    end 

    meanM1(tt,ii) = mean(m1,2); 
end 
matlabpool close force 

を修正することによりnRepの部分に(nSim*nRep X 1)細胞を壊すことでした。しかし、私は同じ「変数 『M1』に分類することができません」、エラーが出ます。

+0

コードを[mcve]に変更してください:**すべての不要なコード**を削除し、すべての入力を提供して、自分でコードを実行してエラーを再現できるようにしてください。 –

+0

コードは今実行できるはずです。唯一のことはmatlabpoolがMATLABの最新バージョンで使用されていないと私は信じています – hipHopMetropolisHastings

答えて

0

ループの前に行列をあらかじめ割り当てていたため、m1は一時変数に分類できないという問題がありました。解決策はparforループ内でm1=Nan(nTs,nSim)を実行することです。

関連する問題