How to simplify this and make it efficient

1 view (last 30 days)
I have a 1x500 cell (res) with a structure in each, and a 300x3 table (G). I need to check for each combination if strcmp between the field res{j}.fir and each row in G.
If it is equal I need to add the field from res 'thisisstring' to a new 4. column in the table G. The following works but is so slooow....
for i = 1:size(G{:,1},1)
for j = 1:size(res,2)
if strcmp(res{j}.fir,G{i,1}{1})
G{i,4} = res{j}.thisisstring;
If someone have an idea to simplify this it would be great!

Accepted Answer

Bruno Luong
Bruno Luong on 5 Sep 2019
Edited: Bruno Luong on 6 Sep 2019
NOTE: what a messy and bad data structure. There might be a much better way than working cell of structs and table.
% Generate test data
S = string(ceil(10*rand(300,3)));
G = table(S(:,1),S(:,2),S(:,3));
fir = num2cell(string(ceil(10*rand(1,500)+5)));
thisisstring = num2cell(string(ceil(100*rand(1,500)+100)));
res = num2cell(struct('fir',fir,'thisisstring',thisisstring));
clear S fir thisisstring % only G and res stay
% Engine here, do the same thing than your double for loops
[b,loc] = ismember( G{:,1}, cellfun(@(r) r.fir, res));
G(b,4) = table(cellfun(@(r) r.thisisstring, res(loc(b)))');
% Check the result
Martin on 6 Sep 2019
Edited: Martin on 6 Sep 2019
I know that is frustrating and that makes completly sense! I would never get back to you with a question like mine. That's why I spent 4-5 hours after your answer to get the string() solution. I knew if someone had a direction of an algorithm I could figure it out. After I did that, I accepted your answer, gave a like, and added a little comment that probably can help others. Thanks Bruno and especially for your answer!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!

Translated by