Làm cách nào để tìm kiếm một chuỗi trong mảng ô trong MATLAB?


103

Giả sử tôi có mảng ô

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

Tôi phải làm gì nếu tôi muốn tìm chỉ mục của 'KU'?


7
Lưu ý rằng câu trả lời hàng đầu hiện tại đã khá lỗi thời. Đảm bảo bạn cũng kiểm tra câu trả lời này .
Dennis Jaheruddin

Câu trả lời:


128

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

11
Hãy nhớ rằng giải pháp chung này là tốt vì nó hoạt động với nhiều loại dữ liệu, nhưng nó chỉ hoạt động cho các đối sánh chính xác. Nếu bạn cần đối sánh không phân biệt chữ hoa chữ thường, hãy xem stackoverflow.com/a/9433112/44737 . Nếu bạn cần đối sánh một thứ gì đó phức tạp hơn như regex hoặc một trường trong một cấu trúc, hãy xem stackoverflow.com/a/8061808/44737
rob

ismember phức tạp hơn một chút và có thể được cập nhật với các phiên bản mới hơn. Tôi cảm thấy an toàn hơn với các hàm dựa trên str như strcmpi, v.v.
Maddy

1
Hoạt động trong Octave cũng vậy
Nino van Hooff

90
>> 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')


5
Tuyệt quá! Giải pháp của bạn phải là giải pháp hàng đầu!
Antonvh

1
Có, tôi đồng ý, đây là giải pháp tốt nhất, tuy nhiên nó chỉ là sự so sánh giữa các giải pháp andreys và vidars. Vì vậy, thực sự andrey nên lấy nó.
Leo

1
Trên thực tế, cần chỉ ra rằng phương pháp này không hoạt động nếu bạn đang so sánh hai mảng có kích thước khác nhau (nghĩa là nếu thay vì 'KU' ở phía bên trái, bạn có một mảng chuỗi). Giải pháp của Vidar thực sự hoạt động trong trường hợp đó (khá tốt), do đó, tổng quát hơn.
Nate

@pankaj: Việc này so với việc tạo Bản đồ chuỗi-> Chỉ số và sau đó nhận chỉ mục bằng cách tra cứu bản đồ như thế nào? Yêu cầu hoàn toàn khôn ngoan.
faizan

39

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ó.


23

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 :).


Tôi sắp sửa chỉnh sửa câu hỏi ban đầu nhưng cưa quá nhiều câu trả lời :)
raggot

13

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))

6

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.


5

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'))

-2

bạn đã thử chưa

indices = Find(strs, 'KU')

xem liên kết

cách khác,

indices = strfind(strs, 'KU');

cũng nên hoạt động nếu tôi không nhầm.


Tôi đã thử tìm nhưng vì mảng là mảng ô nên MATLAB trả về cho tôi một số lỗi ... Nhưng hàm strfind có vẻ hoạt động, cảm ơn!
Benjamin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.