"parfor" skips or fail with filtfilt function
1 view (last 30 days)
Show older comments
Brunno Machado de Campos
on 11 Sep 2018
Commented: Brunno Machado de Campos
on 13 Sep 2018
Hi, I am trying to use 'parfor' to speedy a loop that performs 3 steps to a simple time series (SignCorr): 1 - Detrend 2 - Linear regression 3 - Low Pass Filtering Apparently, 'parfor' skip the step 3. I can run the same code just changing 'parfor' to 'for' and the results are different. Then I noticed that the difference is the LowPass Filtering Step. I am attaching the code only with the LPF and the 'parfor' results in a generic error: "Struct contents reference from a non-struct array object.".
Any idea? Thanks!
Fs = 1/2; % sampling frequency (Hz)
tp = 180; % Time Points
% LowPass Filter design
FpassLOW = 0.1; % passband frequency (Hz)
FstopLOW = 0.1 + (Fs/tp); % stopband frequency (Hz)
ApassLOW = 1;% passband ripple (dB)
AstopLOW = 50; % stopband attenuation (dB)
hLOW = fdesign.lowpass('Fp,Fst,Ap,Ast',FpassLOW,FstopLOW,ApassLOW,AstopLOW,Fs);
HdLOW = design(hLOW, 'equiripple');
EPIreshTMP = zeros(size(finalEPIresh));
tic
parfor tt3 = 1:size(EPIresh,2) % EPIresh = 180x176004 Matrix (Time x Spatial Dimensions)
SignCorr = EPIresh(:,tt3);
MMM = mean(SignCorr);
% Low Pass Filtering
s_filt2 = repmat(s_corr,6,1); % we use the center copy, avoinding phase distortion
s_filtAB1LOW = filtfilt(HdLOW.Numerator,1,s_filt2);
s_filtAB1LOW = s_filtAB1LOW((1+2*180):(3*180));
EPIreshTMP(:,tt3) = s_filtAB1LOW(:) + MMM; %giving the mean back
end
toc
newEPIresh = EPIreshTMP;
6 Comments
Jan
on 13 Sep 2018
Edited: Jan
on 13 Sep 2018
@Brunno: If you post the complete error message, we could see, which line is causing the problem. It is very useful for a discussion, if the readers do not have to guess, where the problem occurs. So please do not post just a part, which seems to be relevant, but everything printed in red to the command window.
Accepted Answer
OCDER
on 12 Sep 2018
Looks like your object HdLOW is not being passed to the parfor correctly.
The output of design seems to be a System Object. https://www.mathworks.com/help/dsp/ref/design.html
parfor processes Objects differently than a pure structure. https://www.mathworks.com/help/distcomp/objects-and-handles-in-parfor-loops.html
Try the following:
EPIresh = rand(180,100000); % simulating my image data
Frgval = [rand(180,6),ones(180,1)]; % simulating my
% regression matrix (confounding series + column of ones
Fs = 0.5; % sampling frequency (Hz)
tp = 180; % Time Points
% LowPass Filter design
FpassLOW = 0.1; % passband frequency (Hz)
FstopLOW = 0.1 + (Fs/tp); % stopband frequency (Hz)
ApassLOW = 1; % passband ripple (dB)
AstopLOW = 50; % stopband attenuation (dB)
hLOW = fdesign.lowpass('Fp,Fst,Ap,Ast',FpassLOW,FstopLOW,ApassLOW,AstopLOW,Fs);
HdLOW = design(hLOW, 'equiripple');
EPIreshTMP = zeros(size(EPIresh));
tic
HdLOW_Numerator = HdLOW.Numerator; %<===Pull out what you need from the object
parfor tt3 = 1:size(EPIresh,2)
SignCorr = EPIresh(:,tt3);
MMM = mean(SignCorr);
% Detrend
SignCorr = detrend(SignCorr,'linear');% detrend
SignCorr = SignCorr + MMM; %giving the mean back
% Regression
b = regress(SignCorr,Frgval);
WReg = Frgval*b;
s_corr = SignCorr - WReg;
s_corr = s_corr + b(end); % giving the mean back
% Low Pass Filtering
s_filt2 = repmat(s_corr,6,1); % I put the real data in a
% sanduiche of itself, avoinding phase distortion
s_filtAB1LOW = filtfilt(HdLOW_Numerator,1,s_filt2); %<===Change this to not call the object
s_filtAB1LOW = s_filtAB1LOW((1+2*180):(3*180)); %¨taking the
% center copy of the series
EPIreshTMP(:,tt3) = s_filtAB1LOW(:)+ b(end);%giving the mean back
end
toc
newEPIresh = EPIreshTMP;
2 Comments
More Answers (0)
See Also
Categories
Find more on Array Geometries and Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!