سبد خرید (0)

بردارهای منطقی در متلب

بردارهای منطقی در متلب، بردارهایی هستند که عناصر آنها تنها مقادیر true یا false یا به عبارت دیگر 0 و 1 هستند. 


استفاده از عبارت های رابطه ای در بردارها و ماتریس ها

می توان از عملگرهای رابطه ای(relational operators) در بردارها و ماتریس ها استفاده نمود. بعنوان مثال فرض کنید یک بردار به نام vec داریم و می خواهیم تمام عناصر(درایه) این بردار را با عدد 5 مورد مقایسه قرار دهیم و بررسی کنیم که آیا هر یک از این عناصر از عدد 5 بزرگتر هستند یا نه. پس از انجام این کار، آنچه در خروجی به دست خواهیم آورد، یک بردار (با همان طول) است که حاوی مقادیر منطقی true یا false است(منظور 0 و 1 است). به مثال زیر توجه کنید:

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 همان طور که در مثال بالا مشاهده می کنید، حاصل، یک بردار است که از مقادیر منطقی true و false (0 ( یعنی 0 و 1) تشکیل شده است. با اینکه آنچه حاصل شده است از 0 و 1 تشکیل شده است و می توان بر روی بردار isg عملیات محاسباتی انجام داد، اما بردار isg از نوع logical است و از نوع double نیست. به مثال زیر توجه کنید:

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 برای اینکه بفهمیم که چه تعداد از عناصر بردار vec از عدد 5 بزرگتر هستند، می توانیم از تابع ()sum استفاده کنیم و بردار isg را به آن بدهیم تا تعداد یک ها را برای ما جمع کند. به مثال زیر توجه کنید: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 کاری که ما انجام دادیم این بود که ابتدا یک بردار منطقی(logical vector) به نام isg ایجاد کردیم. از این بردار منطقی همچنین می توان از این بردار منطقی، برای انیدس گذاری بردار اصلی استفاده نمود. بعنوان مثال اگر تنها به اعداد بزرگتر از 5 در بردار اصلی احتیاج داشته باشیم، می توانیم به صورت زیر عمل کنیم: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 به این روش، اندیس گذاری منطقی(logical indexing) گفته می شود. با استفاده از این دستور، تنها عناصری از بردار vec برگردانده می شوند که عناصر متناظرشان در بردار منطقی isg مقدار true (یعنی 1) داشته باشد. 

سوال فوری!

چرا دستورات زیر به درستی عمل نمی کنند؟

با اجرای کدهای بالا، خطای زیر در متلب نشان داده می شود:

Subscript indices must either be real positive integers or logicals.


پاسخ:

تفاوت بردار v در این مثال، با بردار isg در مثال قبلی، این است که بردار isg یک بردار از نوع logical(منطقی) است؛ در حالی که بردار v یک بردار logical نمی باشد.  مقادیر بردار v به طور پیش فرض از نوع double هستند. برای اندیس گذاری یک بردار، تنها از 0 و 1 های منطقی می توان استفاده نمود. بنابراین اگر بخواهیم بردار v به درستی کار کند، باید آن را به یک بردار منطقی با استفاده از دستور ()logical، تبدیل کنیم: 

 

 برای اینکه بتوانیم یک ماتریس یا یک بردار ایجاد کنیم که تمامی عناصر آنها از 0 و 1های منطقی تشکیل شده باشند، می توانیم از متدهای ()true و ()flase استفاده کنیم. به مثال زیر توجه کنید: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

از نسخه ی R2016a متلب به بعد، با استفاده از توابع ones و zeros هم می توان به طور مستقیم بردارها یا ماتریس های منطقی(logical) را ایجاد نمود: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 


توابع داخلی منطقی(logical) در متلب

در نرم افزار متلب یک سری توابع داخلی وجود دارند که می توان از آنها دررابطه با بردارها و ماتریس های منطقی(logical) استفاده نمود. توابع any و all دو نمونه از توابع مذکور هستند. تابع منطقی any در صورتی که حداقل یکی از عناصر یک بردار true باشد، مقدار منطقی true را برمی گرداند و در غیر این صورت مقدار false را برمی گرداند. 

تابع منطقی all تنها در صورتی که تمام عناصر یک بردار true باشند، مقدار true را برمی گرداند و در غیر این صورت مقدار false را برمی گرداند. به مثال زیر توجه کنید: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 همان طور که در مثال زیر مشاهده می کنید، در بردار vec2 برخی از عناصر true هستند و برخی هم نه. حال اگر به ترتیب توابع any و all را بر روی این بردار اعمال کنیم، مشاهده می کنیم که به ترتیب مقدار true (یعنی 1) و مقدار false (یعنی 0) برگردانده می شوند. 

تابع find اندیس هایی از یک بردار که با معیارهای ما تطابق داشته باشند را برمی گرداند. بعنوان مثال، اگر بخواهیم عناصر درون یک بردار که از عدد 5 بزرگتر هستند را بیابیم، به صورت زیر عمل می کنیم:

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 اگر تابع find را بر روی یک ماتریس اعمال کنیم، به صورت خطی به دنبال معیارها می گردد. یعنی شمارش اندیس عنصر مورد نظر را از ستون اول شروع می کند و سپس ستون دوم را می شمارد و سپس ستون سوم و همینطور الی آخر. به مثال زیر توجه کنید: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 در هردوی بردارها و ماتریس ها، اگر هیچ تطابقی با معیارهای ما وجود نداشته باشد، یک بردار خالی برگردانده خواهد شد. به مثال زیر توجه کنید: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 تابع isequal در مقایسه کردن آرایه ها(بردارها و ماتریس ها) مفید است. همان طور که می دانید، عملگر مساوی است با(==) در متلب، یکی از مقادیر 0 یا 1 را برای هر عنصر درون بردار یا ماتریس برمی گرداند. سپس اگر از بر روی بردار حاصله، تابع all را اعمال کنیم، می توانیم بفهمیم که آیا تمامی عناصر درون آن آرایه با مقدار مورد نظر برابر بوده اند یا نه. حالا تابع درونی isequal کار را ساده کرده است و این وظیفه را به راحتی برای ما انجام می دهد. به مثال زیر توجه کنید: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

همچنین این تابع را می توان بر روی رشته ها نیز به کار برد: 

مثال(آموزش بردارهای منطقی در برنامه نویسی متلب)

 اما در استفاده از تابع isequal یه تفاوت وجود دارد. در صورتی که دو آرایه ی مورد نظر ابعاد یکسانی نداشته باشند، تابع isequal مقدار logical 0 را برمی گرداند، در حالی که اگر از عملگر مساوی است با(==) استفاده کنید، یک پیغام خطا را مشاهده خواهید نمود. 

سوال فوری!

اگر یک بردار به نام vec داشته باشیم که در داخل آن تعدادی عدد منفی وجود داشته باشند، چگونه می توانیم این مقادیر منفی را از بین ببریم؟


پاسخ:

یک راه این است که محل قرار گیری این عناصر را تعیین کنیم، و سپس این عناصر را حذف کنیم: 

بعنوان راه دوم، می توانیم به جای تابع fin d از یک بردار منطقی استفاده کنیم:


تمرین 2.4

سعی کنید نتیجه ی به دست آمده در سوال فوری بالا را بصورت زیر اصلاح کنید: 

به جای اینکه عناصر منفی را پیدا کنید و حذف کنید، عناصر مثبت را پیدا کنید و آنها را نگه دارید!

راهنمایی: به دو روش می توانید این کار را انجام دهید، اول با استفاده از تابع find و دوم با استفاده از یک بردار منطقی که از معیار \(vec\ge 0\) استفاده می کند. 

 

 در ادامه، یک مثال قرار دارد که یکی از کاربردهای توابع ذکر شده را نشان می دهد. 

یک بردار که مشخص کننده ی یک سیگنال است، می تواند حاوی اعداد مثبت و منفی باشد. برای ساده سازی کار، فرض می کنیم که هیچ یک از این اعداد برابر با 0 نیست. حالا می خواهیم موقعیت های عبور از صفر(zero crossing) را در این سیگنال به دست بیاوریم. عبور از صفر به معنی مکان هایی است که سیگنال ما از منفی به مثبت و یا از مثبت به منفی تغییر می کند. برای انجام این کار، باید از توابع sign و diff و find کمک بگیریم، به مثال زیر توجه کنید: 

مثال(بردارهای منطقی در متلب)

 این مثال نشان می دهد که بین عناصر 1 و 2 و بین عناصر 4و5 و بین عناصر 6و7 عبور از صفر انجام گردیده است. 


متلب همچنین دارای عملگرهایی به نام and و or است که می توان از آنها برای انجام عملیات منطقی استفاده نمود. نماد | عملگر  or را نشان می دهد و نماد & عملگر and را نشان می دهد.

این عملگرها دو بردار یا دو ماتریس را مورد مقایسه قرار می دهند تا زمانی که این دو بردار یا ماتریس  تعداد عناصر یکسانی داشته باشند. و سپس بعنوان خروجی، یک بردار یا ماتریس منطقی تشکیل شده از 0ها و 1ها را با همان اندازه برمی گردانند. بعنوان مثال داریم: 

مثال(بردارهای منطقی در متلب)

 


هنگام کار با عملگرهای عددی، باید با اولویت آنها آشنا باشید. جدول 2.1 عملگرها را بر اساس اولویت(تقدم) نشان می دهد: