Unsure why parfor loop does not work in this case

1 回表示 (過去 30 日間)
dsmalenb
dsmalenb 2022 年 8 月 22 日
コメント済み: dsmalenb 2022 年 8 月 25 日
Hello,
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!
Dave

回答 (2 件)

Walter Roberson
Walter Roberson 2022 年 8 月 22 日
編集済み: Walter Roberson 2022 年 8 月 22 日
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 2022 年 8 月 23 日
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));
  3 件のコメント
Edric Ellis
Edric Ellis 2022 年 8 月 24 日
Ah, with that updated code, you have a problem with V because there are two different indexing forms. You probably need the same trick again
vVal = dec2base(..);
V{h+1}{a,1} = vVal;
...
Q{h+1} = strcat(Q{h+1},vVal(k));
dsmalenb
dsmalenb 2022 年 8 月 25 日
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));
end
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
end
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)));
end
Z{h+1} = base2dec(Z{h+1},MValU);
SSet = [SSet, Z{h+1}];
SSet = unique(SSet);
N_New{h+1} = numel(SSet);
end

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeStartup and Shutdown についてさらに検索

タグ

製品


リリース

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by