Câu trả lời:
Tôi đoán đoạn mã sau có thể thực hiện thủ thuật:
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))
Điều này trả lại
ans =
2
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc
Thời gian đã trôi qua là 0,001976 giây.
>> tic; find(strcmp('KU', strs)); toc
Thời gian đã trôi qua là 0,000014 giây.
VẬY, rõ ràng là strcmp('KU', strs)
mất ít thời gian hơn nhiều so vớiismember(strs,'KU')
Kể từ năm 2011a, cách được khuyến nghị là:
booleanIndex = strcmp('KU', strs)
Nếu bạn muốn lấy chỉ mục số nguyên (mà bạn thường không cần), bạn có thể sử dụng:
integerIndex = find(booleanIndex);
strfind
không được dùng nữa, vì vậy hãy cố gắng không sử dụng nó.
Tôi thấy rằng mọi người đã bỏ qua lỗ hổng quan trọng nhất trong mã của bạn:
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
nên là:
strs = {'HA' 'KU' 'NA' 'MA' 'TATA'}
hoặc là
strs = {'HAKUNA' 'MATATA'}
Bây giờ nếu bạn tiếp tục sử dụng
ind=find(ismember(strs,'KU'))
Bạn sẽ không phải lo lắng :).
Các câu trả lời khác có lẽ đơn giản hơn cho trường hợp này, nhưng để hoàn thiện, tôi nghĩ tôi sẽ thêm việc sử dụng cellfun với một hàm ẩn danh
indices = find(cellfun(@(x) strcmp(x,'KU'), strs))
có lợi thế là bạn có thể dễ dàng phân biệt chữ hoa chữ thường hoặc sử dụng nó trong trường hợp bạn có mảng cấu trúc ô:
indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
Mã ngắn nhất:
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
[~,ind]=ismember('KU', strs)
Nhưng nó chỉ trả về vị trí đầu tiên trong strs
. Nếu phần tử không được tìm thấy thì ind=0
.
Các hàm strcmp và strcmpi là cách trực tiếp nhất để thực hiện việc này. Họ tìm kiếm thông qua các mảng.
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))