A very fast way to find elements and their indices? (Is ismember fast?)

20 vues (au cours des 30 derniers jours)
Sim
Sim le 18 Nov 2022
Commenté : Sim le 19 Nov 2022
A very fast way to find elements and their indices? (Is ismember fast?)
This would be my example:
% input: create arrays "a" and "b"
a = {'A23'};
l = 'A' : 'Z';
rl = reshape(l,size(l,2),1);
for i = 1 : size(rl,1)
for j = 1 : 10000
f{i,j} = sprintf('%s%d',rl(i), j);
end
end
b = reshape(f,[],1);
% still part of the input: randomly replace 50 values of "b" with {'A23'}
r = round((size(b,1)-1) .* rand(50,1) + 1);
b(r) = a;
% How can I make this part way much faster ?
tic
[~,idx2] = ismember(string(b),string(a));
b_filtered = b(find(idx2),:);
toc
Elapsed time is 0.057298 seconds.
  4 commentaires
Steven Lord
Steven Lord le 18 Nov 2022
If you're trying to generate random integer values in an interval, use randi instead of rand.
Sim
Sim le 18 Nov 2022
Modifié(e) : Sim le 18 Nov 2022
@Stephen23, yes, I can try the "ismembc" function :-) .....I hope it is "safe", without "side effects" :-)
@John D'Errico, yes, thank you, I have messed up the random part... :-)
@Steven Lord, yes, I will go for "randi", thanks! :-)

Connectez-vous pour commenter.

Réponse acceptée

Bruno Luong
Bruno Luong le 18 Nov 2022
Modifié(e) : Bruno Luong le 18 Nov 2022
You overly complicate your code for nothing, and yes ismember if fast.
Not sure if your a is always single element or just in this example.
% input: create arrays "a" and "b"
a = {'A23'};
l = 'A' : 'Z';
rl = reshape(l,size(l,2),1);
for i = 1 : size(rl,1)
for j = 1 : 10000
f{i,j} = sprintf('%s%d',rl(i), j);
end
end
b = reshape(f,[],1);
% still part of the input: randomly replace 50 values of "b" with {'A23'}
r = round((size(b,1)-1) .* rand(50,1) + 1);
b(r) = a;
% How can I make this part way much faster ?
tic
[~,idx2] = ismember(string(b),string(a));
b_filtered = b(find(idx2),:);
toc
Elapsed time is 0.062962 seconds.
tic
tf = ismember(b,a);
b_filtered = b(tf,:);
toc
Elapsed time is 0.009279 seconds.
% only when a is scalar
tic
b_filtered = b(strcmp(b, a{1}));
toc
Elapsed time is 0.003851 seconds.
  3 commentaires
Bruno Luong
Bruno Luong le 18 Nov 2022
AFAIK ismembc work on numbers, not char array or string, and the second argumentr must be sorted. So it is NOT applicable in your case.
Personally I know this function but I never use it since it is undocumented and I never need to draw the last ounce of speed for ismember.
Sim
Sim le 19 Nov 2022
Thanks a lot @Bruno Luong!! :-)
About: "Not sure if your a is always single element or just in this example.", Yes, it is always a single element (that change in a loop, but always single).

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Matrices and Arrays dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by