การเปรียบเทียบข้อมูล
การเปรียบเทียบข้อมูล มักจะถูกนำมาใช้เป็นเงื่อนไขในโปรแกรมเสมอ แต่ก็เป็นเรื่องที่มือใหม่มักจะทำผิดเสมอเช่นกัน
สมมุติว่าคุณต้องการเปรียบเทียบว่า A เท่ากับ B หรือไม่ สิ่งแรกที่ทุกคนนึกถึง ก็คงจะเป็นเครื่องหมาย
"A==B" (ใช้เท่ากับ 2 ตัว เพื่อเปรียบเทียบความเท่ากัน) แต่หลายๆ คนกลับลืมไปว่า ข้อมูลในโปรแกรมไม่ได้มีชนิดเดียว มันมีทั้งตัวเลข และตัวอักษร และใน MATLAB เวอร์ชั่นใหม่ (ตั้งแต่ 2016b ขึ้นมา) MATLAB ได้แบ่งประเภทข้อมูลตัวอักษรออกเป็น 2 แบบ ซึ่งทำให้การใช้งานข้อมูลประเภทตัวอักษรทำได้ง่ายขึ้น
เช่น
การเปรียบเทียบระหว่างตัวเลข เราสามารถใช้เครื่องหมายเปรียบเทียบพวกนี้ได้
อย่างเช่น
>> A = X==Y
เราจะเห็นว่า A จะได้คำตอบเป็น ture หรือ false แค่คำตอบเดียวเท่านั้น
สังเกตุที่ Size ของ A นะครับ จะเห็นว่ามีขนาดเป็น 1x1 หรือก็คือ คำตอบมีค่าเดียว
แต่ถ้าหากคุณใช้เครื่องหมาย == กับข้อมูลตัวอักษรประเภท char ผลลัพธ์ที่ได้จะต่างกันออกไป
เห็นไหมครับว่าถ้าหากเราใช้เครื่องหมาย == ในการเปรียบเทียบ char มันคือการเปรียบเทียบระหว่างตัวอักษรแต่ละตัว ดังนั้นเราจึงได้คำตอบออกมาหลายคำตอบ ซึ่งต่างจากการเปรียบเทียบตัวเลขที่เราจะได้เพียงคำตอบเดียวเท่านั้น ดังนั้นหากเราเขียนโปรแกรมโดยไม่เข้าใจถึงความแตกต่างนี้ โปรแกรมของเราก็จะทำงานผิดพลาดได้ เช่น ถ้าเราเอาแค่คำตอบแรกไปเป็นเงื่อนไข เราก็จะได้ผลลัพธ์ว่า X มีค่าเท่ากับ Y ซึ่งในความเป็นจริงแล้วมันไม่ได้เป็นเช่นนั้น ซึ่งก็หมายความว่าโปรแกรมของเราทำงานผิดพลาดนั่นเอง
>> X = 4;
>> Y = 5;
>> Z = X==Y;
แต่ถ้าหากข้อมูลนั้นเป็นอาเรย์ ให้ใช้คำสั่ง isequal แทนเครื่องหมาย == เช่น
>> X = [1 2 3];
>> Y = [1 2 3];
>> Z = isequal(X,Y);
เราก็จะได้ผลลัพธ์เป็นคำตอบเดียวเหมือนกับการใช้เครื่องหมาย == (แต่หากเราใช้เครื่องหมาย == เปรียบเทียบอาเรย์ เราจะได้หลายคำตอบ)
- ข้อมูลประเภท char จะใช้เครื่องหมาย ' ' (sigle quote) เช่น
>> A = 'Hello'
>> whos A
Name Size Bytes Class Attributes
A 1x5 10 char
หากใช้คำสั่ง whos ตรวจสอบ เราก็จะเห็นว่า class เป็น char
สำหรับการเปรียบเทียบข้อมูลประเภท char ให้ใช้คำสั่ง strcmp เช่น
>> A = 'Hello';
>> B = 'Hi';
>> C = strcmp(A,B);
- ข้อมูลประเภท string จะใช้เครื่องหมาย "" (double quote) เช่น
>>A = "Hello"
>>whos A
Name Size Bytes Class Attributes
A 1x1 158 string
สังเกตุดูนะครับว่า size จะเหลือแค่ 1 หน่วย คือ นับเป็น 1 ข้อความ ไม่ได้นับเป็นตัวอักษรเหมือน char แต่ขนาดของข้อมูลก็เพิ่มขึ้นเช่นกัน จาก 10 bytes กลายเป็น 158 bytes และ class ก็เปลี่ยนเป็น string
เมื่อข้อมูลกลายเป็น 1 หน่วย การเปรียบเทียบจึงสามารถใช้เครื่องหมายเหมือนตัวเลขได้ (เปรียบเทียบ string กับ string) เช่น
>>A = "Hello";
>>B = "Hello";
>>C = A==B
C =
logical
1
ก็จะได้คำตอบ 1 ค่าเช่นกัน หรือเราจะใช้คำสั่ง strcmp ก็ได้
>>D = strcmp(A,B)
D =
logical
1
ในกรณีที่เราต้องการเปรียบเทียบ string กับ char ก็ทำเช่นเดียวกับการเปรียบเทียบ string กับ string ซึ่งจะได้คำตอบออกมา 1 ค่าเช่นกัน
สรุปนะครับ
1. เปรียบเทียบตัวเลข 1 ตัว ใช้เครื่องหมายเปรียบเทียบในตารางได้ทั้งหมด (== , > , < , ... )
2. เปรียบเทียบตัวเลขหลายตัว (อาเรย์) ใช้คำสั่ง isequal( )
3. เปรียบเทียบ char กับ char ใช้คำสั่ง strcmp
4. เปรียบเทียบ string กับ string หรือ string กับ char ใช้คำสั่ง == หรือ strcmp อันไหนก็ได้
"&&" ใช้กับข้อมูลทั่วไป
"&" ใช้กับข้อมูลประเภทตรรกศาสตร์ (logic)
เช่น
>> X = 'Hello';
>> Y = 'Hellx';
>> Z = X&Y
Z =
1×5 logical array
1 1 1 1 1
จะเห็นว่าคำตอบที่ได้เป็น true ทั้งหมดทั้งๆ ที่ตัวอักษรสุดท้ายต่างกัน (ตัว o กับ x) แต่คำตอบก็ยังเป็น true นั่นก็เพราะว่า ตัวอักษรทุกตัว เมื่อเปลี่ยนเป็น ascii code มันก็คือตัวเลขตัวหนึ่ง ซึ่งในทางคอมพิวเตอร์ ตัวเลขทุกตัวที่ไม่ใช่ 0 ไม่ว่าจะเป็นบวก หรือ ลบ จะมีค่าเป็น true เสมอ ดังนั้นเมื่อ
"จริง และ จริง" ผลลัพธ์ที่ได้ก็เลยเป็น "จริง"
แต่หากเราใช้ && โปรแกรมจะแจ้งเตือน error ดังนี้
Z = X&&Y
Operands to the || and && operators must be convertible to logical scalar values.
ซึ่งหมายความว่า ด้านหน้า และด้านหลังเครื่องหมาย && จะต้องเป็นข้อมูลประเภท scalar เท่านั้น (ข้อมูลตัวเดียว ที่ไม่ใช่อาเรย์)
ส่วนการใช้ "หรือ" ( || ) ก็มีหลักการเช่นเดียวกันกับการใช้ && นะครับ ดังนั้นต้องใช้ให้ถูกต้องนะครับ ไม่งั้นโปรแกรมอาจทำงานผิดพลาดได้
ปกติแล้วคนชอบทำผิดการตรงไหน?
สมมุติว่าคุณต้องการเปรียบเทียบว่า A เท่ากับ B หรือไม่ สิ่งแรกที่ทุกคนนึกถึง ก็คงจะเป็นเครื่องหมาย
"A==B" (ใช้เท่ากับ 2 ตัว เพื่อเปรียบเทียบความเท่ากัน) แต่หลายๆ คนกลับลืมไปว่า ข้อมูลในโปรแกรมไม่ได้มีชนิดเดียว มันมีทั้งตัวเลข และตัวอักษร และใน MATLAB เวอร์ชั่นใหม่ (ตั้งแต่ 2016b ขึ้นมา) MATLAB ได้แบ่งประเภทข้อมูลตัวอักษรออกเป็น 2 แบบ ซึ่งทำให้การใช้งานข้อมูลประเภทตัวอักษรทำได้ง่ายขึ้น
แล้ววิธีการเปรียบเทียบตัวเลข กับวิธีการเปรียบเทียบตัวอักษร ต่างกันอย่างไร?
คำตอบคือ ต่างกันที่ผลลัพธ์ครับเช่น
การเปรียบเทียบระหว่างตัวเลข เราสามารถใช้เครื่องหมายเปรียบเทียบพวกนี้ได้
เครื่องหมาย
|
ความหมาย
|
ตัวอย่าง
|
>
|
มากกว่า
|
A>5
|
<
|
น้อยกว่า
|
B<12
|
>=
|
มากกว่าเท่ากับ
|
C>=9
|
<=
|
น้อยกว่าเท่ากับ
|
D<=26
|
==
|
เท่ากันกับ
|
A==B
|
~=
|
ไม่เท่ากับ
|
C~=D
|
~ หรือ
not()
|
ไม่
|
E = ~(A) หรือ E = not(A)
|
อย่างเช่น
>> A = X==Y
เราจะเห็นว่า A จะได้คำตอบเป็น ture หรือ false แค่คำตอบเดียวเท่านั้น
สังเกตุที่ Size ของ A นะครับ จะเห็นว่ามีขนาดเป็น 1x1 หรือก็คือ คำตอบมีค่าเดียว
แต่ถ้าหากคุณใช้เครื่องหมาย == กับข้อมูลตัวอักษรประเภท char ผลลัพธ์ที่ได้จะต่างกันออกไป
เห็นไหมครับว่าถ้าหากเราใช้เครื่องหมาย == ในการเปรียบเทียบ char มันคือการเปรียบเทียบระหว่างตัวอักษรแต่ละตัว ดังนั้นเราจึงได้คำตอบออกมาหลายคำตอบ ซึ่งต่างจากการเปรียบเทียบตัวเลขที่เราจะได้เพียงคำตอบเดียวเท่านั้น ดังนั้นหากเราเขียนโปรแกรมโดยไม่เข้าใจถึงความแตกต่างนี้ โปรแกรมของเราก็จะทำงานผิดพลาดได้ เช่น ถ้าเราเอาแค่คำตอบแรกไปเป็นเงื่อนไข เราก็จะได้ผลลัพธ์ว่า X มีค่าเท่ากับ Y ซึ่งในความเป็นจริงแล้วมันไม่ได้เป็นเช่นนั้น ซึ่งก็หมายความว่าโปรแกรมของเราทำงานผิดพลาดนั่นเอง
แล้ววิธีการที่ถูกต้องควรจะทำอย่างไร?
1. ข้อมูลประเภทตัวเลข
หากเป็นตัวเลขเดียว สามารถใช้เครื่องหมายเปรียบเทียบในตารางด้านบนได้เลย เช่น>> X = 4;
>> Y = 5;
>> Z = X==Y;
แต่ถ้าหากข้อมูลนั้นเป็นอาเรย์ ให้ใช้คำสั่ง isequal แทนเครื่องหมาย == เช่น
>> X = [1 2 3];
>> Y = [1 2 3];
>> Z = isequal(X,Y);
เราก็จะได้ผลลัพธ์เป็นคำตอบเดียวเหมือนกับการใช้เครื่องหมาย == (แต่หากเราใช้เครื่องหมาย == เปรียบเทียบอาเรย์ เราจะได้หลายคำตอบ)
2. ข้อมูลประเภทตัวอักษร
ใน MATLAB เวอร์ชั่นใหม่ๆ จะแบ่งประเภทตัวอักษรออกเป็น char และ string ซึ่งมีวิธีเขียนที่ต่างกันดังนี้- ข้อมูลประเภท char จะใช้เครื่องหมาย ' ' (sigle quote) เช่น
>> A = 'Hello'
>> whos A
Name Size Bytes Class Attributes
A 1x5 10 char
หากใช้คำสั่ง whos ตรวจสอบ เราก็จะเห็นว่า class เป็น char
สำหรับการเปรียบเทียบข้อมูลประเภท char ให้ใช้คำสั่ง strcmp เช่น
>> A = 'Hello';
>> B = 'Hi';
>> C = strcmp(A,B);
- ข้อมูลประเภท string จะใช้เครื่องหมาย "" (double quote) เช่น
>>A = "Hello"
>>whos A
Name Size Bytes Class Attributes
A 1x1 158 string
สังเกตุดูนะครับว่า size จะเหลือแค่ 1 หน่วย คือ นับเป็น 1 ข้อความ ไม่ได้นับเป็นตัวอักษรเหมือน char แต่ขนาดของข้อมูลก็เพิ่มขึ้นเช่นกัน จาก 10 bytes กลายเป็น 158 bytes และ class ก็เปลี่ยนเป็น string
เมื่อข้อมูลกลายเป็น 1 หน่วย การเปรียบเทียบจึงสามารถใช้เครื่องหมายเหมือนตัวเลขได้ (เปรียบเทียบ string กับ string) เช่น
>>A = "Hello";
>>B = "Hello";
>>C = A==B
C =
logical
1
ก็จะได้คำตอบ 1 ค่าเช่นกัน หรือเราจะใช้คำสั่ง strcmp ก็ได้
>>D = strcmp(A,B)
D =
logical
1
ในกรณีที่เราต้องการเปรียบเทียบ string กับ char ก็ทำเช่นเดียวกับการเปรียบเทียบ string กับ string ซึ่งจะได้คำตอบออกมา 1 ค่าเช่นกัน
สรุปนะครับ
1. เปรียบเทียบตัวเลข 1 ตัว ใช้เครื่องหมายเปรียบเทียบในตารางได้ทั้งหมด (== , > , < , ... )
2. เปรียบเทียบตัวเลขหลายตัว (อาเรย์) ใช้คำสั่ง isequal( )
3. เปรียบเทียบ char กับ char ใช้คำสั่ง strcmp
4. เปรียบเทียบ string กับ string หรือ string กับ char ใช้คำสั่ง == หรือ strcmp อันไหนก็ได้
การใช้ "และ" กับ "หรือ"
เครื่องหมาย "&&" หมายความว่า "และ" ทางตรรกศาสตร์ แต่หลายๆ คนมักจะเขียนผิดโดยเขียน "&" แค่ตัวเดียว ซึ่งมันก็หมายความว่า "และ" เหมือนกัน แต่ใช้กับข้อมูลคนละแบบ คือ"&&" ใช้กับข้อมูลทั่วไป
"&" ใช้กับข้อมูลประเภทตรรกศาสตร์ (logic)
เช่น
>> X = 'Hello';
>> Y = 'Hellx';
>> Z = X&Y
Z =
1×5 logical array
1 1 1 1 1
จะเห็นว่าคำตอบที่ได้เป็น true ทั้งหมดทั้งๆ ที่ตัวอักษรสุดท้ายต่างกัน (ตัว o กับ x) แต่คำตอบก็ยังเป็น true นั่นก็เพราะว่า ตัวอักษรทุกตัว เมื่อเปลี่ยนเป็น ascii code มันก็คือตัวเลขตัวหนึ่ง ซึ่งในทางคอมพิวเตอร์ ตัวเลขทุกตัวที่ไม่ใช่ 0 ไม่ว่าจะเป็นบวก หรือ ลบ จะมีค่าเป็น true เสมอ ดังนั้นเมื่อ
"จริง และ จริง" ผลลัพธ์ที่ได้ก็เลยเป็น "จริง"
แต่หากเราใช้ && โปรแกรมจะแจ้งเตือน error ดังนี้
Z = X&&Y
Operands to the || and && operators must be convertible to logical scalar values.
ซึ่งหมายความว่า ด้านหน้า และด้านหลังเครื่องหมาย && จะต้องเป็นข้อมูลประเภท scalar เท่านั้น (ข้อมูลตัวเดียว ที่ไม่ใช่อาเรย์)
ส่วนการใช้ "หรือ" ( || ) ก็มีหลักการเช่นเดียวกันกับการใช้ && นะครับ ดังนั้นต้องใช้ให้ถูกต้องนะครับ ไม่งั้นโปรแกรมอาจทำงานผิดพลาดได้