Conditional case on strfind

17 visualizzazioni (ultimi 30 giorni)
Jacky
Jacky il 9 Apr 2014
Modificato: Azzi Abdelmalek il 10 Apr 2014
Hi all,
I have a problem on with the strfind in matlab:
x =
{
'my height is 160'
'my height is 163'
'my height is 167'
'my height is 180');
feature_1 = find(~cellfun('isempty',strfind(x,'my height is 163')))
the output will be:
feature_1 =
2
Now my problem is how do i find for "my height is > 163" ?
Thanks.

Risposte (3)

dpb
dpb il 9 Apr 2014
Not easily by character matching/searching. You'd need to convert the numeric value strings in the and then do the search on that. SOTOO (warning, air code, untested)...
find(cellfun(@(x) str2double(x(end-3:end)),x)>163)
  1 Commento
Jacky
Jacky il 10 Apr 2014
Thank you so much :), it works! This is checking for the last 3 numbers which are greater than 163 right? How if the x is like this:
x = {'my height is 160'
'my height is 163'
'my height is 167'
'my height = "180"'};
then the last cell cannot be matched because of the quotation marks before and after the number? Any way to solve this?
Thank you.

Accedi per commentare.


Azzi Abdelmalek
Azzi Abdelmalek il 9 Apr 2014
Modificato: Azzi Abdelmalek il 10 Apr 2014
x ={ 'my height is 160'
'my height is 163'
'my height is 167'
'my height is 180'};
num=regexp(x,'[0-9]+(\.)?[0-9]?','match')
out=x(str2double([num{:}])>163)
  2 Commenti
Jacky
Jacky il 10 Apr 2014
Modificato: Jacky il 10 Apr 2014
Thanks so much for your reply. I'm also using regular expression to solve this. But, if the x is like this:
x = {'my height is 1'
'my height is 13'
'my height is 5'
'my height = "2"'};
A = find(~cellfun('isempty',regexp(x, 'height = "[0-5]"', 'match')));
B = find(~cellfun('isempty',regexp(x, 'height is [0-5]', 'match')));
The output is:
>> B
B =
1
2
3
>> A
A =
4
The output for B is incorrect, because 'my height is 13' is included, but this is not suppose to included as 13 is not within the range of [0-5]. What is the mistake i made in the regular expression there?
Thank you.
Azzi Abdelmalek
Azzi Abdelmalek il 10 Apr 2014
This is not my answer. don't change [0-9],
num=regexp(x,'[0-9]+(\.)?[0-9]?','match')
a=str2double([num{:}])
The result is
1 13 5 2
Now we find the range 0-5
out=x(a>0 & a<=5 )

Accedi per commentare.


Jos (10584)
Jos (10584) il 10 Apr 2014
Approach this in two steps:
Step 1. Convert the strings to a numerical values. This step depends on how the strings are made up. If there is always one and only one value in each string, you can do something like this:
s = regexp(x,'\d+','match')
num = str2double([s{:}])
Step 2. Use logical indexing to get the indices into x
tf = num > 2 & num <= 5 % whatever
indices = find(tf)
result = x(tf)

Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by