2012-02-24 37 views
5

Tôi đang cố gắng tìm các vị trí nơi chuỗi con xuất hiện trong một mảng ô trong MATLAB. Mã dưới đây hoạt động, nhưng khá xấu xí. Dường như với tôi có một giải pháp dễ dàng hơn.Mảng tìm kiếm MATLAB cho tập con chuỗi

cellArray = [{'these'} 'are' 'some' 'nicewords' 'and' 'some' 'morewords']; 
wordPlaces = cellfun(@length,strfind(cellArray,'words')); 
wordPlaces = find(wordPlaces); % Word places is the locations. 
cellArray(wordPlaces); 

này cũng tương tự, nhưng không giống như thisthis.

Trả lời

7

Điều cần làm là đóng gói ý tưởng này dưới dạng hàm. Hoặc inline:

substrmatch = @(x,y) ~cellfun(@isempty,strfind(y,x)) 

findmatching = @(x,y) y(substrmatch(x,y)) 

Hoặc chứa trong hai m-file:

function idx = substrmatch(word,cellarray) 
    idx = ~cellfun(@isempty,strfind(word,cellarray)) 

function newcell = findmatching(word,oldcell) 
    newcell = oldcell(substrmatch(word,oldcell)) 

Vì vậy, bây giờ bạn có thể chỉ cần gõ

>> findmatching('words',cellArray) 
ans = 
    'nicewords' 'morewords' 
+0

Chúc mừng! Điều đó có hiệu quả, nhưng có một điều là tôi đã hy vọng sẽ có một chức năng được xây dựng cho điều này, hoặc ít nhất là một cách để làm điều đó trong các bước ít hơn. Nếu ai đó đến với một cái gì đó tuyệt vời, nếu không tôi sẽ đánh dấu điều này như là một giải pháp trong một vài giờ. – dgmp88

+0

Theo như tôi biết không có chức năng tích hợp. Tôi đã có cùng một vấn đề bản thân mình một lúc trở lại, và cuối cùng đã viết những đoạn mã này bởi vì tôi không thể tìm thấy một built-in đã làm những gì tôi muốn. –

+0

Đủ công bằng. Tôi sẽ đi với điều này sau đó - cổ vũ! – dgmp88

4

tôi không biết nếu bạn xem nó là đơn giản hơn là giải pháp hơn của bạn, nhưng regular expressions là một tiện ích đa năng rất tốt mà tôi thường sử dụng để tìm kiếm các chuỗi. Một cách để trích xuất các ô từ cellArray có chứa các từ có 'words' trong chúng như sau:

>> matches = regexp(cellArray,'^.*words.*$','match'); %# Extract the matches 
>> matches = [matches{:}]        %# Remove empty cells 

matches = 

    'nicewords' 'morewords' 
+0

Giải pháp tuyệt vời, nhưng tôi rất sợ các biểu thức chính quy. Nó là ít dòng mã, nhưng tôi đã đánh dấu đúng ở trên như tôi muốn tránh regexp. Xin lỗi, điều đó có vẻ hơi không công bằng vì điều này là đúng và theo nghĩa đơn giản hơn. – dgmp88

+0

@ dgmp88: Tôi hiểu hoàn toàn. Các biểu thức thông thường làm một số việc quen với việc sử dụng, nhưng một khi bạn nhận được kết quả của chúng, bạn [cảm thấy giống như một siêu anh hùng] (http://xkcd.com/208/). ;) – gnovice

Các vấn đề liên quan