MATLAB help always showing true to if condition

조회 수: 3 (최근 30일)
Samyukta Ramnath
Samyukta Ramnath 2013년 6월 3일
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
Samyukta Ramnath
Samyukta Ramnath 2013년 6월 4일
But REGEXP is mainly for performing operations on the found substring, right? I just need to see if the word is there.
Daniel Shub
Daniel Shub 2013년 6월 4일
No, REGEXPREP Does replacements, REGEXP just does the search.

댓글을 달려면 로그인하십시오.

채택된 답변

Daniel Shub
Daniel Shub 2013년 6월 4일
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
Samyukta Ramnath
Samyukta Ramnath 2013년 6월 5일
Thank you! That works. :)
Daniel Shub
Daniel Shub 2013년 6월 6일
Please consider accepting an answer if your problem is solved. Also, please consider voting for other answers that were helpful.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Ken Atwell
Ken Atwell 2013년 6월 3일
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
Ken Atwell
Ken Atwell 2013년 6월 3일
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
Samyukta Ramnath
Samyukta Ramnath 2013년 6월 4일
Oh My. I copied and pasted this exact code into my MATLAB script and ran it, and nothing happened.

댓글을 달려면 로그인하십시오.


Iain
Iain 2013년 6월 4일
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
Daniel Shub
Daniel Shub 2013년 6월 4일
For STRCMP it is not about having the strings IN them, it is about BEING them.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 String Parsing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by