MATLAB Answers

How to call protected functions in parfor?

9 views (last 30 days)
Tmfu Vh
Tmfu Vh on 26 Jul 2019
Commented: Tmfu Vh on 30 Jul 2019
This function is inside the common methods block of a class.
function GetWavelets(Me)
%Unrelated codes omitted…
parfor c=1:ttpc
%Me is the object itself, OnProgressReport is protectedly defined.
The protected function OnProgressReport is unaccessible in the parfor loop. I found two workarounds:
  • Use for loop instead of parfor;
  • Set the Access attribute of OnProgressReport to public.
If I want to preserve the parfor loop for performance reasons, is it unavoidable to expose the OnProgressReport to public? Any other solutions?
Update 20190728: The OnProgressReport function is inherited from the superclass.


Sign in to comment.

Answers (1)

Edric Ellis
Edric Ellis on 26 Jul 2019
Edited: Edric Ellis on 29 Jul 2019
EDIT: Changed my version to inherit protected method from parent class
Hm, I can't reproduce the problem - I tried in R2016b and R2019a. Here are my test classes:
%% Super.m:
classdef Super
properties (Access = private)
Value = 7
methods (Access = protected)
function out = protectedMethod(obj, x)
out = obj.Value + x;
%% Test.m:
classdef Test < Super
function out = runInParfor(obj)
parfor ii = 1:4
out(ii) = obj.protectedMethod(ii);
which I exercise like this:
>> runInParfor(Test)
ans =
8 9 10 11
So, it appears to work for me. Could you elaborate on what you're doing differently?


Tmfu Vh
Tmfu Vh on 28 Jul 2019
Sorry my description has some mistakes. That protected function is inherited from the superclass. Please try again thanks!
Edric Ellis
Edric Ellis on 29 Jul 2019
Ok, I updated my attempt to reproduce the problem, still works fine for me...
Tmfu Vh
Tmfu Vh on 30 Jul 2019
Well I got it. The exception details showed in the commandline window is misleading - it said that the OnProgressReport function is undefined, but the real bug I found later has nothing to do with that function. So tricky! Whatever thank you for your patience.

Sign in to comment.

Sign in to answer this question.