Matlab 仅当我不';你不使用parfor吗?

Matlab 仅当我不';你不使用parfor吗?,matlab,bsxfun,Matlab,Bsxfun,在下面的第一个Matlab脚本中,当我如图所示运行它时,我没有得到任何错误,代码产生了预期的结果,但是,当我打开matlabpool和关闭matlabpool以及将parfor循环更改为for循环时,我得到以下错误: Running... ??? Error using ==> mldivide Matrix is singular to working precision. Error in ==> NSS_betas at 11 betas = G\data.

在下面的第一个Matlab脚本中,当我如图所示运行它时,我没有得到任何错误,代码产生了预期的结果,但是,当我打开matlabpool和关闭matlabpool以及将parfor循环更改为for循环时,我得到以下错误:

Running...       ??? Error using ==> mldivide
Matrix is singular to working precision.
Error in ==> NSS_betas at 11
    betas = G\data.y2.';
Error in ==> DElambda at 19
        betas(:,ii) = NSS_betas(P1(:,ii),data); end
Error in ==> Individual_Lambdas at 46
    beta{ii} = DElambda(de,dataList, @OF_NSS);
如果需要,我将很乐意发送CRM_22_12.mat

为什么只有在使用常规for循环而不是parfor循环时才会触发错误

clear all, clc

load Euro_CRM_22_12.mat

matlabpool open 

tic

warnState(1) = warning('error', 'MATLAB:singularMatrix'); 
warnState(2) = warning('error', 'MATLAB:illConditionedMatrix'); 

mats  = 1:50;
mats2 = [2 5 10 30];


% RO: unloop these
de = struct(...
'min', [0;0],...
'max', [50;50],...
'd'  , 2,...
'nP' , 500,...
'nG' , 600,...
'ww' , 0.1,...
'F'  , 0.5,...
'CR' , 0.99,...
'R'  , 0,...
'oneElementfromPm',1);

% RO: initialize beta
beta  = cell(size(rates,1),1);

clc, fprintf('Running...       ');

%for ii = 1:size(rates,1)
parfor ii = 1:size(rates,1)    
% RO: use status indicator for things that take this long
%fprintf('\b\b\b\b\b\b\b%6.2f%%', ii/size(rates,1)*100);

dataList = struct(...
    'yM'   , rates(ii,:),...
    'mats' , mats,...
    'model', @NSS,...
    'mats2', mats2,...
    'y2'   , rates(ii,mats2));

beta{ii} = DElambda(de,dataList, @OF_NSS);

end

toc

matlabpool close
%


这有点神秘,但我可以肯定地告诉你

Error in ==> NSS_betas at 11
    betas = G\data.y2.';
Error in ==> DElambda at 19
        betas(:,ii) = NSS_betas(P1(:,ii),data); end
Error in ==> Individual_Lambdas at 46
    beta{ii} = DElambda(de,dataList, @OF_NSS);
本质上,这意味着G矩阵是奇异的,因此没有解。这就是:

G =  [ones(nObs,1),...
     (1-exp(-mats/lambda(1)))./(mats/lambda(1)),...
    ((1-exp(-mats/lambda(1)))./(mats/lambda(1)) - exp(-mats/lambda(1))),...
    ((1-exp(-mats/lambda(2)))./(mats/lambda(2)) - exp(-mats/lambda(2)))];

betas = G\data.y2.';

为了进一步诊断这一点,我要做的是设置stop on error标志。有几种方法可以做到这一点,一种是从网络上,另一种是从网络上。看看矩阵是否正确。很可能,有些事情不对劲。追溯错误,你会发现的。

这有点神秘,但我可以肯定地告诉你

Error in ==> NSS_betas at 11
    betas = G\data.y2.';
Error in ==> DElambda at 19
        betas(:,ii) = NSS_betas(P1(:,ii),data); end
Error in ==> Individual_Lambdas at 46
    beta{ii} = DElambda(de,dataList, @OF_NSS);
本质上,这意味着G矩阵是奇异的,因此没有解。这就是:

G =  [ones(nObs,1),...
     (1-exp(-mats/lambda(1)))./(mats/lambda(1)),...
    ((1-exp(-mats/lambda(1)))./(mats/lambda(1)) - exp(-mats/lambda(1))),...
    ((1-exp(-mats/lambda(2)))./(mats/lambda(2)) - exp(-mats/lambda(2)))];

betas = G\data.y2.';

为了进一步诊断这一点,我要做的是设置stop on error标志。有几种方法可以做到这一点,一种是从网络上,另一种是从网络上。看看矩阵是否正确。很可能,有些事情不对劲。追溯错误,你会发现的。

谢谢Pearsonartphto,但我知道这是产生错误的原因,如果我没有说清楚的话,很抱歉。让我困惑的是,为什么在使用parfor时不会发生此错误?只有当我使用for ii=1:size(rates,1)而不是parfor ii=1:size(rates,1)时,才会发生错误??parfor循环中错误的处理方式是否不同?它们的处理方式有点不同,parfor也有点沙盒。再次感谢您,您能否详细说明它们的不同处理方式以及沙盒的含义?我以这种方式进行编码的原因是rdivide正在生成这些错误消息,因此rdivide显然在使用rcond()来测试矩阵的条件。我需要检查矩阵的条件,而不是再次调用rcond()来复制这项工作,我只想访问rcond值和/或决定rdivide正在生成的矩阵是否条件恶劣。理想情况下,在并行结构中这是可能的吗?谢谢Pearsonartphto,但我知道这是产生错误的原因,如果我没有说清楚的话,很抱歉。让我困惑的是,为什么在使用parfor时不会发生此错误?只有当我使用for ii=1:size(rates,1)而不是parfor ii=1:size(rates,1)时,才会发生错误??parfor循环中错误的处理方式是否不同?它们的处理方式有点不同,parfor也有点沙盒。再次感谢您,您能否详细说明它们的不同处理方式以及沙盒的含义?我以这种方式进行编码的原因是rdivide正在生成这些错误消息,因此rdivide显然在使用rcond()来测试矩阵的条件。我需要检查矩阵的条件,而不是再次调用rcond()来复制这项工作,我只想访问rcond值和/或决定rdivide正在生成的矩阵是否条件恶劣。理想情况下,在并行结构中,这是可能的吗?