# How to simplify this and make it efficient

2 views (last 30 days)
Martin on 5 Sep 2019
Edited: Martin on 6 Sep 2019
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;
end
end
end
If someone have an idea to simplify this it would be great!

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
G
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!

### Categories

Find more on Logical 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!

Translated by