Unsure why parfor loop does not work in this case

11 views (last 30 days)
I am in the process of converting my initial multilogic module (Multilogic_v4.m) into a parallel version (MultiLogic_v1_parallel.m). I use two functions: my own MAPR function and I use the permn function. I am mostly done but I cannot get the last line of code in the main module to work and I am not sure why. My guess is that parfors may have some kind of limitation with concatenating strings?
I would appreciate if anyone can take a look at my code and tell me what I seem to be doing wrong.
FYI - I disabled the "while" loop in the parallel version for debugging.
Thanks to the community!

Answers (2)

Walter Roberson
Walter Roberson on 22 Aug 2022
Edited: Walter Roberson on 22 Aug 2022
N_New{h+1} = N{h+1}+1;
That is one update of N_New
N_New{h+1} = numel(SSet);
and that is a second update within the same parfor.
%while N_New{h+1} > N{h+1} && N_New{h+1} < MValU ^ (MValU ^ Arity)
Do not use N_New that way. Use a temporary variable and store the final results into N_New before the end of the parfor

Edric Ellis
Edric Ellis on 23 Aug 2022
The problematic variables appear to be both M and P. For M, you have multiple different "reads" from the variable after the initial assignment. Perhaps try
mVal = MAPR(MValU, Arity, OValU);
M{h+1} = mVal;
S{h+1} = mVal(:,j)'; % etc.
Likewise with P
pVal = permn(SSet,Arity);
P{h+1} = pVal;
V{h+1}{a,1} = dec2base(pVal(j,a),MValU,size(M{h+1},1));
dsmalenb on 25 Aug 2022
Do you mean like so (see bwlow). It is running now but it is not producing the correct output.
for j=1:size(P{h+1},1)
for a=1:Arity
vVal = dec2base(pVal(j,a),MValU,size(M{h+1},1));
V{h+1}{a,1} = vVal;
%V{h+1}{a,1} = dec2base(pVal(j,a),MValU,size(M{h+1},1));
Z{h+1} = '';
for k=1:size(M{h+1},1)
Q{h+1} = '';
for a=1:Arity
Q{h+1} = strcat(Q{h+1},vVal(k));
%Q{h+1} = strcat(Q{h+1},V{h+1}{a,1}(k)); % Does not like this one line
loc{h+1} = base2dec(Q{h+1},MValU) + 1;
Z{h+1} = strcat(Z{h+1},num2str(M{h+1}(loc{h+1},Arity+1)));
Z{h+1} = base2dec(Z{h+1},MValU);
SSet = [SSet, Z{h+1}];
SSet = unique(SSet);
N_New{h+1} = numel(SSet);

Sign in to comment.





Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!