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

27 次查看(过去 30 天)
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 个评论
Steven Lord
Steven Lord 2022-11-18
If you're trying to generate random integer values in an interval, use randi instead of rand.
Sim
Sim 2022-11-18
编辑:Sim 2022-11-18
@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! :-)

请先登录,再进行评论。

采纳的回答

Bruno Luong
Bruno Luong 2022-11-18
编辑:Bruno Luong 2022-11-18
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 个评论
Bruno Luong
Bruno Luong 2022-11-18
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 2022-11-19
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).

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by