2017-08-30 3 views
1

En espérant que vous pourrez m'aider avec cette erreur. Je cours du code pour adapter des courbes aux âges en utilisant un régime de validation croisé. Je répète l'ajustement de la courbe 1000 fois pour évaluer le meilleur ajustement.Matlab: Travailler pour des sauts de boucle dans parfor lors de l'ajustement des courbes

je définis mes modèles comme:

linear_ft = fittype({'x', '1'}); 
monotonic_ft= fittype({'-1/x', '1'}); 
quadratic_ft = fittype('poly2'); 

je lance la commande suivante pour parcourir les différentes sélections de partage des données, l'enregistrement des résidus suivant l'ajustement de courbe ...

Data = randn(4,300,10,10); 
Ages = randn(300,1); 

for thisDim1 = 1:4 
    for thisDim2 = 1:10 
     for thisDim3 = 1:10 
      for nIts = 1:1000 
       RandomOrder = randperm(300,300); 
       Fit_Subs = RandomOrder(1:length(Ages)/2); % Take random subs to fit to 
       Test_Subs = RandomOrder(length(Ages)/2+1:300); % Take random subs to test fit to 

       Fit_Data = squeeze(Data(thisDim1,Fit_Subs,thisDim2,thisDim3)); % Take data to fit to 
       Test_Data = squeeze(Data(thisDim1,Test_Subs,thisDim2,thisDim3)); % Take data to test fit 

       Fit_Ages = Ages; 
       Fit_Ages(Fit_Subs) = []; %Take ages of Fit Subs only 
       Test_Ages = Ages; 
       Test_Ages(Test_Subs) = []; % Take ages of Test Subs only 

       Nsubs = (length(Ages)/2); 

       % Model Data using Curves 
       fFit_Lin = fit(Fit_Ages,Fit_Data',linear_ft); 
       fFit_Mon = fit(Fit_Ages,Fit_Data',monotonic_ft); 
       fFit_Quad = fit(Fit_Ages,Fit_Data',quadratic_ft); 

       % Fit Modelled Data to Test Data 
       tFit_Lin = fFit_Lin(Test_Ages); 
       tFit_Mon = fFit_Mon(Test_Ages); 
       tFit_Quad = fFit_Quad(Test_Ages); 

       % Calculate Median Residual 
       Lin_Med_Resid(nIts) = median(tFit_Lin - Test_Data'); 
       Mon_Med_Resid(nIts) = median(tFit_Mon - Test_Data'); 
       Quad_Med_Resid(nIts) = median(tFit_Quad - Test_Data'); 

      end 
     end 
    end 
end 

Si vous lancez-le avec la quatrième boucle (nIts) comme une boucle for-play. Si vous exécutez comme une boucle parfor il ne sera pas en indiquant l'erreur:

Error using fit>iFit (line 264) The name 'lower' is not an accessible property for an instance of class 'llsqoptions'.

Error in fit (line 108) [fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...

Est-ce que quelqu'un a une idée comment résoudre ce problème? Je serais très reconnaissant pour tout conseil !!

Merci,

Ben

+0

Étrange. Votre code fonctionne pour moi. – informaton

+0

Oh - ça fonctionne comme un parfor? – Ben

+0

Oui, en tant que parfor. Je me demande pourquoi votre boîte à outils d'ajustement de courbe et la boîte à outils de traitement parallèle provoquent un conflit ici. Vous pouvez essayer un «tout effacer» pour faire bonne mesure. – informaton

Répondre

1

Essayez de redémarrer Matlab ou en tapant clear all pour voir si elle efface les choses pour vous.

Votre code fonctionne pour moi, mais la boîte à outils parallèle peut être un peu difficile dans mon expérience.

+0

Merci @information Je pensais que j'avais tout effacé mais clairement je ne l'avais pas. Je vais laisser le poste, car il peut être utile pour quelqu'un qui veut faire un ajustement de courbe ou utiliser la boîte à outils parallèle. Merci encore. – Ben