2017-03-01 67 views
0

因此,我一直在研究整個上午,但無法弄清楚爲什麼這段代碼無法運行。在MATLAB中對單元陣列的功能進行故障分類「parfor」Loop

原來的代碼是:

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 

我最初的想法是,罪魁禍首是

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

dataQCell的指數是指數(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 

到(nSim*nRep X 1)細胞破碎成nRep份但我得到相同的「無法變量‘M1’分類」,錯誤。

+0

請嘗試將您的代碼轉換爲[mcve]:刪除**所有不必要的代碼**並提供所有輸入,以便我們可以自行運行您的代碼並重現錯誤。 –

+0

代碼應該能夠立即執行。唯一的事情是我相信MATLAB最新版本中沒有使用matlabpool – hipHopMetropolisHastings

回答

0

問題是m1不允許分類爲臨時變量,因爲我在parfor循環之前預先分配了矩陣。解決方法是在parfor循環內運行m1=Nan(nTs,nSim)