اپراتورهای مقایسه و عملگرهای منطقی در متلب
به نام خدا و سلام.
به جلسه یازدهم از سری جلسات آموزش نرم افزار متلب خوش آمدید. آموزش تخصصی متلب به صورت رایگان از وبسایت متلب پلاس ارائه میشود. در این جلسه نوبت به معرفی اپراتورهای مقایسه و منطقی در نرم افزار متلب میرسد. با استفاده از اپراتورهای مقایسه میتوان به مقایسه برابری، کوچکتر یا بزرگتری دو عبارت پرداخت. همچنین میتوان از (یا) و عطفی (و) در این عملگرها استفاده کرد. مباحث این جلسه کمک زیادی به یادگیری اصول برنامه نویسی میکند.
با متلب پلاس همراه باشید.
مقدمهای بر اپراتورهای مقایسه و عملگرهای منطقی
در این جلسه با انواع مختلف مقایسه در متلب آشنا میشویم. مقایسه میتواند روی اعداد، بردارها، ماتریسها و هر نوع دادهای صورت بگیرد. پاسخی که متلب بعنوان نتیجهی یک مقایسه به ما میدهد یک عبارت منطقی است. به عبارت دیگر متلب به ما میگوید بله یا خیر. این بله یا خیر در زبان متلب به صورت عدد صفر و یک میباشد. البته صفر (نه) و یک (بله) عدد نیستند بلکه یک عبارت منطقی میباشند. پس از یادگیری مقایسه و عبارتهای منطقی، عملگرهای منطقی ارائه میشوند. یعنی برای مقایسه در متلب، شرط گذاری میکنیم. مثلا میگوییم a از 3 بزرگتر و از 8 کوچکتر باشد. و یا مثالهای دیگر. این نوع عبارتها با استفاده از عملگرهای منطقی ساخته میشوند. در ادامه آموزش کامل متلب هر یک از این موارد ارائه میشود.
لطفا نرم افزار متلب را باز کنید و تمام مثالهایی که در ادامه میآیند را شما هم بنویسید!
نتیجه مقایسه در متلب، یک عبارت منطقی است!
قبل از شروع بحث مقایسه باید توجه کنیم که همیشه نتیجهی مقایسه در متلب، یک عبارت منطقی (Logical) است. این عبارت منطقی همواره دو حالت دارد. بله (true) یا خیر (false). نرم افزار متلب بله/درست (true) را با یک و خیر/غلط (false) را با صفر نشان میدهد. با دانستن همین نکته به سراغ اپراتورهای مقایسه در متلب میرویم.
اپراتورهای مقایسه در متلب
بطور کلی 6 نوع مقایسه بین دو عبارت میتوان انجام داد. برابری، نابرابری، بزرگتر، کوچکتر، بزرگتر مساوی و کوچکتر مساوی. همهی این 6 نوع مقایسه در نرم افزار متلب وجود دارد. حال هر کدام را توضیح میدهیم.
تساوی (برابری) در متلب ==
برای بررسی برابری (تساوی) دو مقدار (عبارت) در متلب از == یا eq(a,b) استفاده میشود. در واقع عملگر مساوی (=) برای اختصاص دادن و عملگر (==) برای بررسی تساوی میباشد. حتما این تفاوت را بخاطر داشته باشید. برای بررسی تساوی در متلب، کافیست دو مقدار یا عبارتی که قصد بررسی داریم را در طرفین == بنویسیم. همچنین میتوانیم دو عبارت را درون تابع eq(a,b) نیز بنویسیم.
>> a = 4; >> b = 3; >> a == b
ans = 0
>> eq(a,b)
ans = 0
پاسخ صفر به معنای نادرست بودن یا خیر است. واضح است که 2 با 4 برابر نیست.
در طرفین == میتوان بردار یا ماتریس هم قرار داد. برای مقایسه دو بردار یا دو ماتریس، بایستی دارای ابعاد برابر باشند. تساوی روی تمام درایههای ماتریس یا بردار وارد شده بررسی میشود. خروجی نیز بردار یا ماتریسی به اندازه آرایههایی است که در حال مقایسه هستند. مثلا:
>> m1 = [1 2; 3 4]; >> m2 = [1 3; 1 4]; >> m1 == m2
ans = 1 0 0 1
>> eq(m1,m2)
ans = 1 0 0 1
>> u1 = [1 2 3 4]; >> u2 = [0 2 5 4]; >> u1 == u2
ans = 0 1 0 1
>> eq(u1,u2)
ans = 0 1 0 1
یک عدد هم قابل مقایسه با بردار یا ماتریس (و برعکس) میباشد. در این صورت تمام درایهها با مقدار وارد شده مقایسه میشوند. مثلا
>> A = [1 2 3; 3 4 1; 6 7 3] >> A == 3
ans = 0 0 1 1 0 0 0 0 1
در ماتریس A سه درایه داریم که مقدار آنها 3 است.
نابرابری در متلب =~
مشابه با تعریف برابری، نابرابری (عدم تساوی) را در متلب داریم. برای بررسی نابرابری (عدم تساوی) در متلب از =~ یا تابع ne(a,b) استفاده میشود. برای نوشتن علامت ~ از shift و دکمه کنار عدد 1 (سمت چپ و بالای کیبورد) استفاده میکنیم. در بررسی نابرابری هم میتوان دو مقدار ساده، دو بردار، دو ماتریس و یا یک مقدار با ماتریس یا بردار را مقایسه کرد.
>> m1 = [1 2; 3 4]; >> m2 = [1 3; 1 4]; >> m1 ~= m2
ans = 0 1 1 0
>> 1 ~= m2
ans = 0 1 0 1
>> 4 ~= 3
ans = 1
>> u1 = [1 2 3 4]; >> u2 = [0 2 5 4]; >> u1 ~= u2
ans = 1 0 1 0
کوچکتر و بزرگتر در متلب > <
برای مقایسه کوچکتر یا بزرگتر در متلب از < یا > استفاده میشود. فرم دستوری نیز برای مقایسه کوچکتر یا بزرگتر در متلب وجود دارد. دستور gt(a,b) برای بررسی بزرگتری و دستور lt(a,b) برای بررسی کوچکتری میباشد. برای استفاد از فرم دستوری، توجه کنید که ترتیب ورودی اول و دوم مهم است.
>> 6 < 8
ans = 1
>> lt(6,8)
ans = 1
>> lt(8,6)
ans = 0
>> 4 > 3
ans = 1
>> gt(4,3)
ans = 1
>> gt(3,4)
ans = 0
بررسی کوچکتری و بزرگتری دو آرایه (بردار و ماتریس) و یا یک عدد اسکالر با یک آرایه هم قابل انجام است.
>> u1 = [1 2 3 4]; >> u2 = [0 2 5 4]; >> u1 > u2
ans = 1 0 0 0
>> u1 < u2
ans = 0 0 1 0
>> 3 > u1
ans = 1 1 0 0
>> 3 < u1
ans = 0 0 0 1
کوچکتر مساوی و بزرگتر مساوی در متلب => =<
چنانچه بعد از علامت > یا < یک = اضافه کنیم، این عملگرها به بزرگتر مساوی و کوچکتر مساوی تبدیل میشوند. در این حالت هم میتوان دو عدد، دو آرایه و یا یک عدد و یک آرایه را باهم مقایسه کرد.
اگر هم دوست دارید از دستورات متلب استفاده کنید، ge(a,b) همان بزرگتر مساوی و le(a,b) همان کوچکتر مساوی است.
>> 6 >= 6
ans = 1
>> u1 = [1 2 3 4]; >> u2 = [0 2 5 4]; >> u1 >= u2
ans = 1 1 0 1
>> 2 <= u1
ans = 0 1 1 1
عملگرهای منطقی در متلب
عملگرهای منطقی کاربرد وسیعی در نرم افزار متلب دارند. اما در این جلسه قصد داریم از عملگرهای منطقی برای ترکیب شرایط مقایسه استفاده کنیم. در بالا روش مقایسه ارائه شد اما ممکن است قصد داشته باشیم مقایسه ترکیبی انجام دهیم. برای مقایسه ترکیبی باید از عملگرهای منطقی بهره بگیریم. ترکیبهای منطقی شامل 3 دسته کلی هستند. نقیض، ترکیب عطفی (و) و ترکیب فصلی (یا). در ادامه هر مورد را توضیح میدهیم.
نقیض یا not در متلب ~
نقیض هر عبارت، متضاد آن را نتیجه میدهد. برای ایجاد نقیض در متلب از ~ یا not(A) استفاده میشود.
>> ~ true
ans = 0
>> not(false)
ans = 1
>> ~~ true
ans = 1
در مثال بالا، توجه داریم که نقیضِ نقیض هر عبارت برابر با خود آن عبارت است.
ترکیبهای عطفی (و ، and) در متلب
ترکیب عطفی در متلب با استفاده از & یا and ایجاد میشود. ترکیب عطفی تقریبا معادل است با بحث اشتراک در ریاضی. به این صورت که ترکیب عطفی دو عبارت تنها زمانی درست است که هر دو عبارت درست باشند. یا هر دو شرط برقرار باشد. در جدول زیر همه حالتهایی که در یک ترکیب عطفی وجود دارد آمدهاست.
ترکیبهای فصلی (یا ، or) در متلب
ترکیب فصلی در متلب با استفاده از | یا or ایجاد میشود. برای نوشتن | از Shift و کلید بالای Enter استفاده میکنیم. ترکیب فصلی تقریبا معادل است با بحث اجتماع در ریاضی. به این صورت که ترکیب فصلی دو عبارت تنها زمانی نادرست است که هر دو عبارت نادرست باشند. یا هر دو شرط برقرار نباشد. در سایر حالات، همواره ترکیب فصلی درست است. در جدول زیر همه حالتهایی که در یک ترکیب فصلی وجود دارد آمدهاست.
اکنون که با ترکیبهای عطفی و فصلی در متلب آشنا شدیم به حل مثال میپردازیم.
>> A = [1 2 3; 4 5 6; 7 8 9] >> A > 6 | A < 3
ans = 1 1 0 0 0 0 1 1 1
>> A = [1 2 3; 4 5 6; 7 8 9]; >> A > 3 & A < 8
ans = 0 0 0 1 1 1 1 0 0
در مثال بالا سمت چپ، از یک ترکیب عطفی برای بررسی درایههای ماتریس A استفاده کردهایم. شرط ترکیب عطفی به این صورت است که مقادیری از A که بزرگتر از 3 و کوچکتر از 8 باشند. در مثال سمت راست نیز از یک ترکیب فصلی استفاده شدهاست. به این صورت که درایههایی از A که یا بزرگتر از 6 باشند و یا کوچکتر از 3.
تشریح اتصال کوتاه در متلب
عملگرهای منطقی عطفی و فصلی (and, or) که در متلب با & و | نمایش داده می شوند، دو حالت دیگر دارند. با اتصال کوتاه (&& و ||) و بدون اتصال کوتاه (& و |). تفاوت این دو عملکرد در این است که در حالت اتصال کوتاه با رسیدن به عبارت false ادامه گزاره فراخوانی نمیشود. اما در حالت بدون اتصال کوتاه تمامی اجزای گزاره اجرا میشود و در نهایت خروجی میدهد. همچنین عملگرهای با اتصال کوتاه تنها بر دادههای اسکالر عمل میکنند اما عملگر بدون اتصال کوتاه بر روی ماتریسها نیز عمل میکند. برای درک بهتر این تفاوت به شکل زیر دقت کنید.
استخراج دادههای یک آرایه با اپراتورهای مقایسه و منطقی
به کمک آنچه تا این مرحله یاد گرفتیم میتوانیم بخشی از یک بردار یا ماتریس را با شرایط دلخواه استخراج کنیم. برای این کار از اندیس گذاری و عملگرهای منطقی استفاده میکنیم. در مثالهای بالا دیدیم که شرایطی از ماتریس A را درنظر گرفتیم که منجر به پاسخ منطقی (صفر و یک) شد. اما قصد داریم که درایههای متناظر را بدست بیاوریم. برای این کار کافیست کل عبارت منطقی را درون یک پرانتز بعد از آرایه بنویسیم. یعنی
>> A = [1 2 3; 4 5 6; 7 8 9]; >> A(A > 3 & A < 8)
ans = 4 7 5 6
>> A = [1 2 3; 4 5 6; 7 8 9]; >> A(A > 6 | A < 3)
ans = 1 7 2 8 9
به این ترتیب میتوانیم از یک آرایه عددی (ماتریس یا بردار) درایههایی که شرایط خاص دارند را استخراج کنیم.
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول
یک ماتریس 4×4 شامل اعداد 1 تا 16 ایجاد کنید. عناصری از این ماتریس که کوچکتر از 13 و بزرگتر از 6 هستند را بیابید. سپس به این درایههای مشخص مقدار صفر را اختصاص دهید.
تمرین دوم
یک ماتریس 4×4 شامل اعداد 1 تا 16 ایجاد کنید. عناصری از این ماتریس که کوچکتر از 4 یا بزرگتر از 11 هستند را بیابید. سپس به این درایههای مشخص مقدار صفر را اختصاص دهید.
تمرین سوم
تساوی دو ماتریس 3×3 تصادفی را بررسی کنید. این کار را چندین مرتبه تکرار کنید تا ماتریسهای تصادفی متنوع بررسی شوند. چه نتیجهای میگیرید؟ (متلب هیچگاه یک ماتریس تصادفی را تکرار نمیکند!)
جمعبندی
خب، جلسه یازدهم از سری جلسات آموزش برنامه نویسی متلب به پایان رسید. این جلسه درباره عملگرهای مقایسه و منطقی در متلب صحبت کردیم. مقایسه تساوی، عدم تساوی، کوچکتر و بزرگتری و ترکیبهای فصلی و عطفی. سعی ما انتقال مفاهیم به زبانی ساده و ارائه مثالهای متنوع بود. هدف اصلی تیم متلب پلاس ارائه آموزش متلب به صورت کاملا رایگان است. در انتها چند تمرین برای یادگیری بیشتر به شما واگذار کردیم که پاسخ آنها در کانال تلگرامی متلب پلاس وجود دارد. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
5 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام
وقتتون بخیر
چجوری میشه در یک ماتریس m*n برای هر سطر دستور منطقی or رو اجرا کرد؟
سلام و عرض ادب
برای بررسی عبارت or روی سطرهای یک ماتریس بایستی از دو حلقه for تودرتو استفاده کرد.
مثلا اگر یک ماتریس w به ابعاد 10 سطر و 3 ستون داشته باشیم و بخواهیم شرط or را روی هر سطر محاسبه کنیم:
;n=10
;v=zeros(n)
for i=1:n
v(i)=w(i,1)| w(i,2)| w(i,3)
end
سلام خسته نباشین میشه بی زحمت یه سئوال بپرسم از خدمتتون؟
اتصال کوتاه فقط برای && هست؟
چون برای || چک کردم جواب نمی ده اون وقت || دقیقا کارش چیه؟
a=12;
b=34;
c=1;
d=4;
a>b && a>c
ans =
logical
0
a=12;
b=34;
c=1;
d=4;
a>b || a>c
ans =
logical
1
با درود فراوان
&& به معنای «و» است، به عبارتی هر دو شرط باید صادق باشد تا جواب 1 شود، اما || به معنای «یا» است، یعنی اگر یکی از دو شرط هم صادق بود جواب 1 خواهد شد.
سلام چرا در مورد تمرین اول و دوم این اشکال پیش میا د و هیچ جور رفع هم نمیشه>>
a=[1:16]
a =
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
>> b=reshape(a,4,4)
b =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
>> c=b’
c =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> d=c11
d =
4×4 logical array
1 1 1 0
0 0 0 0
0 0 0 1
1 1 1 1
>> e=c(d)=0
e=c(d)=0
↑
Incorrect use of ‘=’ operator. Assign a value to a variable using ‘=’ and compare values for equality using ‘==’.
>>