Vectorising conditional for loop

1 Ansicht (letzte 30 Tage)
Melanie VT
Melanie VT am 10 Mär. 2023
Kommentiert: Melanie VT am 10 Mär. 2023
Hi,
I have a code snippet which updates one of the inputs (struct_data2) using a conditional for loop. I tried to implement a vectorised solution but couldn't achieve it. Support on how to cope with this will be greatly appreciated.
Thanks in advance,
Mel
struct_data1 = struct_data1_root;
struct_data2 = struct_data2_root;
empty_struct_data2_idx = cellfun(@isempty, {struct_data2(:).cid}.');
match_idx = find(empty_struct_data2_idx);
for i = 1: height(struct_data1)
cond = struct_data1(i).nid;
if cond > 1
count = size(match_idx, 1);
rand_idx_id = randperm(count, cond-1);
[struct_data2(match_idx(rand_idx_id)).cid] = deal(struct_data1(i).cid);
match_idx = removerows(match_idx, 'ind', rand_idx_id);
end
end
  1 Kommentar
Catalytic
Catalytic am 10 Mär. 2023
Please don't .zip your attachments. It makes it harder for us to extract your data and use the Answers run feature.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Matt J
Matt J am 10 Mär. 2023
Bearbeitet: Matt J am 10 Mär. 2023
Perhaps as follows,
empty_struct_data2_idx = cellfun('isempty', {struct_data2(:).cid}.');
match_idx = find(empty_struct_data2_idx);
struct_data1([struct_data1.nid]<=1)=[];
CIDpool=repelem([struct_data1.cid], [struct_data1.nid]-1);
Nmatch=min(numel(match_idx), numel(CIDpool));
CIDpool=num2cell(CIDpool(1:Nmatch));
locations=randperm(numel(match_idx),Nmatch);
[struct_data2(match_idx(locations)).cid]=deal(CIDpool{:});
  1 Kommentar
Melanie VT
Melanie VT am 10 Mär. 2023
Works like a charm! Thank you very much @Matt J🙏🏼

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Startup and Shutdown finden Sie in Help Center und File Exchange

Produkte


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by