Vectorising conditional for loop
1 view (last 30 days)
Show older comments
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 Comment
Catalytic
on 10 Mar 2023
Please don't .zip your attachments. It makes it harder for us to extract your data and use the Answers run feature.
Accepted Answer
Matt J
on 10 Mar 2023
Edited: Matt J
on 10 Mar 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{:});
More Answers (0)
See Also
Categories
Find more on Startup and Shutdown 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!