MATLAB help always showing true to if condition
    9 views (last 30 days)
  
       Show older comments
    
So, I wanted to write a program to classify text files based on their topic. The code below shows a very crude implementation of the same, but it isn't working properly. It is always showing a true value to the if condition, so I am getting Greetings four times and then Colloquial four times. What's up?
if true
File1 = fopen('Hello.xml','r');
File2 = fopen('Hello2.xml','r');
File3 = fopen('Colloquial1.xml','r');
File4 = fopen('Colloquial2.xml','r');
A = fscanf(File1, '%s');
B = fscanf(File2, '%s');
C = fscanf(File3, '%s');
D = fscanf(File4, '%s');
if ~( strcmp(A,'Hi') || strcmp(A,'Hello') || strcmp(A,'how'))
     disp('Greetings.');
end
if ~( strcmp(B,'Hi') || strcmp(B,'Hello') || strcmp(B,'how'))
      disp('Greetings');
end    
if ~( strcmp(C,'Hi') || strcmp(C,'Hello') || strcmp(C,'how'))
      disp('Greetings');
end    
if ~( strcmp(D,'Hi') || strcmp(D,'Hello') || strcmp(D,'how'))
      disp('Greetings');
end
if ~( strcmp(A,'lite'))
     disp('Colloquial.');
end
if ~( strcmp(B, 'lite'))
      disp('Colloquial');
end    
if ~( strcmp(C, 'lite'))
      disp('Colloquial');
end    
if ~( strcmp(D, 'lite'))
      disp('Colloquial');
end  
end
3 Comments
Accepted Answer
  Daniel Shub
      
      
 on 4 Jun 2013
        The strcmp function requires an exact match. We can define a simple test function to see if a string is either exactly 'Hi' or exactly 'lite'
test = @(A)([strcmp(A,'Hi'), strcmp(A,'lite')])
Then
 test('Hi')
     1     0
 test('lite')
     0     1
 test('Hilite')
     0     0
In words: Hi is Hi, but it is not lite. lite is not Hi but is lite, and Hilite is neither Hi nor lite.
Are you potentially looking for STRFIND
 test = @(A)([~isempty(strfind(A,'Hi')), ~isempty(strfind(A,'lite'))])
 test('Hi')
     1     0
 test('lite')
     0     1
 test('Hilite')
     1     1
5 Comments
  Daniel Shub
      
      
 on 6 Jun 2013
				Please consider accepting an answer if your problem is solved. Also, please consider voting for other answers that were helpful.
More Answers (2)
  Ken Atwell
    
 on 3 Jun 2013
        It is not clear what the contents of the files are and what the expected ("correct") output ought to be. Be aware that strcmp returns different results than a C programmer might expect:
strcmp might be returning 1 where you are expecting 0.
If that is not the problem, you will need to provide more context -- namely, the first line of the four files you are parsing.
3 Comments
  Ken Atwell
    
 on 3 Jun 2013
				Take out the not operators (the difference between MATLAB and C) and it seems to work okay for me:
File1 = fopen('Hello.xml','r');
File2 = fopen('Hello2.xml','r');
File3 = fopen('Colloquial1.xml','r');
File4 = fopen('Colloquial2.xml','r');
A = fscanf(File1, '%s');
B = fscanf(File2, '%s');
C = fscanf(File3, '%s');
D = fscanf(File4, '%s');
if strcmp(A,'Hi') || strcmp(A,'Hello') || strcmp(A,'how')
   disp('Greetings A');
end
if strcmp(B,'Hi') || strcmp(B,'Hello') || strcmp(B,'how')
    disp('Greetings B');
end    
if strcmp(C,'Hi') || strcmp(C,'Hello') || strcmp(C,'how')
    disp('Greetings C');
end    
if strcmp(D,'Hi') || strcmp(D,'Hello') || strcmp(D,'how')
    disp('Greetings D');
end
if strcmp(A,'lite')
   disp('Colloquial A');
end
if strcmp(B, 'lite')
    disp('Colloquial B');
end    
if strcmp(C, 'lite')
    disp('Colloquial C');
end    
if strcmp(D, 'lite')
    disp('Colloquial D');
end  
if true
  % code
end
Output is:
 Greetings A
 Greetings B
 Colloquial C
 Colloquial D
  Iain
      
 on 4 Jun 2013
        Do A, B, C, and D actually have those strings in them, EXACTLY like what you're comparing them to?
I suspect they have a different case. Try strcmpi instead of strcmp.
What do you get when you get matlab to print out A, B, C & D?
1 Comment
  Daniel Shub
      
      
 on 4 Jun 2013
				For STRCMP it is not about having the strings IN them, it is about BEING them.
See Also
Categories
				Find more on Characters and Strings in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



