2013-07-03 22 views

Odpowiedz

12

Pierwszy krok należy użyć tablicę komórek zamiast tablicy ciągów:

arr = {'hello', 'world'; 'hello', 'again'; 'I----', 'said-'; 'hello', 'again'}; 

drugie, wykorzystują unikatowe, aby uzyskać unikalne ciągów (to nie działa na tablicy ciągów, dlatego proponuję komórkę):

[unique_strings, ~, string_map]=unique(arr); 

Następnie tryb wykorzystania na zmiennej string_map znaleźć najczęstsze wartości:

most_common_string=unique_strings(mode(string_map)); 
+4

+1: ale nie ma potrzeby tworzenia tablic komórek. Możesz użyć 'unique (arr, 'rows')'. –

+0

Oh świetnie, dzięki! Nie używam ich bardzo często, nie znałem tej funkcji. –

+0

Po prostu uwaga na temat tablic sznurkowych i powyższego komentarza: w tym przypadku ciąg musiałby zostać ponownie sformatowany, aby każdy ciąg był osobnym wierszem, zamiast próbować mieć dwa ciągi na jednej linii - działa to tylko jako komórka , w przeciwnym razie Matlab traktuje całą linię jako pojedynczy połączony ciąg znaków, tzn. początkowe "arr" w pytaniu jest równoważne "[" helloworld "," helloagain ";," I ---- said "," helloagain "] –

-1

Lepiej używać macierzy komórek i funkcji regexp; zachowanie tablic ciągów może nie być tym, czego oczekujesz.

arr = {'hello', 'world'; 'hello', 'again'; 'I----', 'said-'; 'hello', 'again'}; 

Jeśli używasz

hellos = sum(~cellfun('isempty', regexp(arr, 'hello'))); 

zwróci liczbę 'hello' „s w macierzy komórkowej arr.

+2

-1: Pytanie dotyczy znalezienia najczęstszego ciągu znaków, nie określony określony z góry ciąg znaków. –

+0

Nawet jeśli szukałeś konkretnego ciągu, 'regexp' byłoby trochę przesadzone. 'strcmp' może być użyty do identyfikacji równych ciągów w tablicy komórek. – kwatford