آموزش عملیات و نمایه سازی منطقی در نرم افزار متلب به زبان ساده
در این جا، در مورد عملیات منطقی صحبت می کنیم، نحوه استفاده از مهارت های MATLAB برای تحلیل هزینه های خرید را بررسی می کنیم. نحوه استفاده از عملیات منطقی برای جستجو در ماتریس داده های بزرگ را بسیار سریع خواهید آموخت.
شروع کار
در کل، ما فرض می کنیم شما قبلا در مورد عملیات بولین می دانید. اگر نه از شما میخواهم عملگرهای اصلی جبر بولی را به ویژه عملگرهای AND، OR و NOT را مرور کنید. عملیات بولین جزء هسته اصلی فن آوری های رایانه ای است. همانند هر زبان برنامه نویسی دیگر، Matlab از عملیات منطقی پایه پشتیبانی می کند. در ادامه، عملیات منطقی را می توان با عملیات ماتریس مخلوط کرد. به همین ترتیب عملیات منطقی از اجزای مهم زبان است.
در اینجا یک خلاصه ساده از نحو و نوع ورودی و خروجی برای سه اپراتور منطقی AND، OR و NOT عنوان می شود.
عنصر A، B، C می تواند ماتریس، بردار یا اسکالر باشد:
AND Logical/double Logical C = A & B
OR Logical/double Logical C= A | B
NOT Logical/double Logical C= ~ A
ورودی های شما فقط باید ۱ و ۰ باشد یا درست و نادرست باشد. ورودی های غیر صفر (مثبت یا منفی) به عنوان یک منطقی ۱ در نظر گرفته می شوند و فقط ۰ ورودی ۰ منطقی می باشد.
حال بیایید ببینیم که این توابع چگونه می توانند مفید باشند.
ما با یک مثال خوب کار خواهیم کرد جمعه سیاه (روزی است که کل جمعیت ایالات متحده در حال خرید است تا محصولات با قیمت پایین را پیدا کند). فرض کنید که به تازگی شما در یک خرده فروشی از طریق خرید آنلاین بوده اید.
حتما بخوانید: ۴ تا از بهترین و مطمئن ترین مراکز انجام پروژه های متلب در ایران
برای کنترل خرید ماهیانه شما قول داده اید که وعده های خرید خود را به ترتیب در یک لیست قرار دهید و شما لیست خرید ماهانه را در یک فایل اکسل نگه می دارید تا آن را در انتهای هر ماه با استفاده از Matlab تجزیه و تحلیل کنید.
یک لیست خرید در اکسل
شما می توانید هزینه های ماهانه خود را از فایل اکسل در یک آرایه در MATLAB با استفاده از دستور xlsread بخوانید.
۱ |
Nov28Expenses=xlsread(‘November28.xlsx’,’C:C’); |
حالا شما هزینه های خود را در یک آرایه دارید و می خواهید بدانید:
- چند مورد هزینه کرد بیش از ۱۰۰ دلار بوده.
- تعداد اقلام کمتر از ۵۰ دلار چیست.
- تعداد اقلام بین ۱۰۰ تا ۵۰۰ دلار چیست.
- و غیره…
بیایید ابتدا در مورد چند موردی که بین ۱۰۰ تا ۳۰۰ دلار بوده جستجو کنیم.
از آنجا که شما یک ماتریس Nov28Expenses دارید، بسیار آسان است که با استفاده از عملگرهای AND (یا &) یک عنصر خاص بین ۱۰۰ تا ۳۰۰ دلار را پیدا کرد.
۱ |
Nov28Expenses(1)>=100 & Nov28Expenses(1)<=300 |
حال ادامه عملیات را با استفاده از یک حلقه تکرار ادامه می دهیم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ |
Costs100to300=[];
for i=1:length(Nov28Expenses)
if Nov28Expenses(i)>=100 & Nov28Expenses(i)<=300 Costs100to300=[Costs100to300 Nov28Expenses(i)]; % concatenating end end display([‘You spent between $100 to $300 on ‘ num2str(length(Costs100to300))’ items.’ ‘Individual costs are ‘ num2str(Costs100to300) ‘ dollars.’]) |
در برنامه فوق، عناصر بردار به طور جداگانه در تکرارهای پی در پی مورد بررسی قرار می گیرند و نتیجه در Costs100to300 ذخیره می شود.
کد بالا را می توان با استفاده از تابع جستجو بسیار راحت تر انجام داد.
سعی کنید این فرمان را به جای حلقه انجام دهید.
۱ |
Costs100to300=Nov28Expenses(find(Nov28Expenses>=100 & Nov28Expenses<=300)); |
اجازه بدهید آن را آنالیز کنیم
>> Nov28Expenses
Nov28Expenses =
۲۰۰ ۱۰۰ ۶۰ ۵۰۰ ۳۰ ۲۰ ۶۰ ۱۵۰ ۲۱۰
>>Nov28Expenses>=100 & Nov28Expenses<=300
ans =
۱ ۱ ۰ ۰ ۰ ۰ ۰ ۱ ۱
تابع find مقادیر عددی مورد نظر را بصورت زیر بر میگرداند:
>> find(Nov28Expenses>=100 & Nov28Expenses<=300)
ans =
۱ ۲ ۸ ۹
همه اینها در یک فرمان انجام شد.
اکنون این دستور را امتحان کنید. این نیز دقیقا همان نتیجه را می دهد
۱ |
Costs100to300=Nov28Expenses(Nov28Expenses>=100 & Nov28Expenses<=300); |
توجه کنید که در این مورد، تابع جستجو مورد نیاز نیست. MATLAB به طور خودکار این شاخص ها را انتخاب می کند که منطقی است.
می توانید عملیات پیچیده تر را با نمایه سازی منطقی امتحان کنید.
حتما بخوانید: دانلود رایگان ۱۳ فیلم کاربردی آموزش شبکه عصبی در متلب +pdf
فرض کنید شما می خواهید بدانید چقدر می توانید با کاهش ۱۰٪ قیمت تمام اقلام صرفه جویی کنید. با این حال می دانید که نمی توانید ۵۰۰ دلار اجاره را کاهش دهید، بنابراین شما باید چیزی شبیه به این را انجام دهید:
۱ ۲ ۳ ۴ |
NewExp=Nov28Expenses;
NewExp(NewExp~=500)=0.9*NewExp(NewExp~=500);
Saving=sum(Nov28Expenses)-sum(NewExp); |
در ادامه، درباره نوع داده ها صحبت می کنیم. شما یاد خواهید گرفت که چگونه آنها را تبدیل کنید و باید چه چیزهایی را در نظر بگیرید. دو دلیل که در مورد تبدیل بین انواع داده ها نگرانی ایجاد می کند عبارتند از:
- سرعت محاسبات
- اندازه حافظه
برای ماتریس های بسیار کوچک و برنامه های کوچک، اگر شما از int8 استفاده کنید و نه دو برابر، پیشرفت بزرگی را نمی بینید. اثربخشی استفاده از نوع داده مناسب در هنگام استفاده از ماتریس های بزرگتر (تصاویر، فیلم ها، داده های بزرگ برای هوش مصنوعی، سیستم های عصبی عظیم) آشکار می شود.
برای کمک به توضیح برخی از این مفاهیم، یک نمونه ساده را انجام خواهیم داد. اول، ما با یک فایل تصویر شروع می کنیم. از آنجا که تصاویر به طور معمول توسط یک ماتریس از مقادیر که هر پیکسل با برخی عدد صحیح بین ۰-۲۵۵ مطابقت دارد، نگاشت می شود، استفاده از uint8 به عنوان نوع داده در این جا منطقی است؛ بنابراین، ما آن را به عنوان ماتریس ۹۰۰ × ۵۹۰ ذخیره می کنیم. چه اتفاقی می افتد اگر از نوع داده double استفاده می کردیم؟
>> double_confucious = double(gray_confucious);
اگر به ویرایشگر متغیر نگاه کنید،
شما دو متغیر دارید، تصویر خاکستری که توسط یک ماتریس از نوع uint8 و یک ماتریس از مقادیر double
هنگامی که یک مقدار به دیگری تبدیل می شود، مقدار جدید متناسب با نوع داده جدید تنظیم می شود. به طور خلاصه، Matlab نزدیکترین عنصر در نوع داده جدیدتر که متناسب با مقدار قبلی است را انتخاب میکند، به مثال های زیر دقت کنید.
>> uint8(240.1)
ans = 240
>> uint8(240.7)
ans = 241
>> uint8(275)
ans = 255
از آنجا که نوع داده uint8 محدود به عدد صحیح در محدوده ۰-۲۵۵ است، مقدار به تابع تبدیل uint8 () به نزدیکترین عدد صحیح گرد می شود. در مثال آخر، تبدیل بزرگتر از حد ۲۵۵ است، بنابراین آن را به نزدیکترین مقدار uint8 یعنی ۲۵۵ گرد می کند. بسیار مهم است که این را به یاد داشته باشید. فراموش کردن این نقطه می تواند منجر به اشکالاتی شود که معمولا ردیابی آنها بسیار سخت است.
با این پس زمینه کوتاه از این که چگونه تابع تبدیل کار می کند، بیایید بررسی کنیم که چرا شما می خواهید انواع داده های مختلف را تبدیل کنید. به عنوان مثال با بازگشت به مثال تصویر، اولین چیزی که باید در نظر بگیریم حافظه ای است که برای ذخیره تصویر uint8 در مقایسه با تصویر double لازم است. از تابع whos () برای اطلاعات در مورد متغیرهای ذخیره شده استفاده کنید.
>> whos()
Name Size Bytes Class Attributes
double_confucious 900×۵۹۸ ۴۳۰۵۶۰۰ double
gray_confucious 900×۵۹۸ ۵۳۸۲۰۰ uint8
در اینجا می توانید یکی از مهمترین دلایل اینکه چرا باید نوع داده را مشخص کنید ببینید. تصویر در نوع داده double 8 برابر بزرگتر از تصویر uint8 است. شما می توانید ببینید که چگونه این مسئله می تواند در مجموعه های بزرگتری از داده ها مانند تصاویر متوالی (یک فیلم) مشکل آفرین باشد.
مزیت اصلی دیگری که در تعیین نوع داده مناسب وجود دارد سرعت است. به طور کلی، استفاده از کوچکترین نوع داده منجر به محاسبه سریعتر می شود. در واقع، در سطح پردازنده، جمع کردن دو عدد صحیح ۸ بیت، نیاز به عملیات کمتر از جمع دو عدد ۶۴ بیت است، حتی اگر در مقادیر یکسان باشند.
حتما بخوانید: ۷ درس کاربردی آموزش برنامه نویسی در متلب (فیلم+زبان فارسی)
در این مثال، از تکنیک تشخیص لبه در هر دو تصویر uint8 و تصویر double استفاده می کنیم. پس از آن یک کلوز مورفولوژیکی بر روی هر دو تصویر انجام می شود. تابع imclose معمولا برای اتصال خطوط غیر متصل پس از تشخیص لبه استفاده می شود.
۰۱ ۰۲ ۰۳ ۰۴ ۰۵ ۰۶ ۰۷ ۰۸ ۰۹ ۱۰ ۱۱ ۱۲ |
% Preallocation
im1 = zeros(size(gray_confucious),’uint8′); im2 = zeros(size(double_confucious),’double’);
tic im1 = edge(gray_confucious); im1 = imclose(im1,strel(‘disk’,2)); toc tic im2 = edge(double_confucious); im2 = imclose(im2,strel(‘disk’,2)); toc |
به طور شگفت انگیز، شما می توانید موارد زیر را ببینید:
- زمان اتمام تصویر ۰٫۱۷۲۷۰۷ uint8 ثانیه است
- زمان صرف شده برای تصویر double 0.061692 ثانیه است
همان طور که می بینید نسخه uint8 این عملیات بیش از ۲٫۵ بار طولانی تر از نسخه double است! نگاهی به کد تابع لبه توضیح می دهد که چرا این اتفاق افتاده است. آشکارساز لبه پیش فرض، یعنی Sobel detector، یک روش مبتنی بر مشتق است. از آنجایی که پاسخ مشتق همیشه یک عدد صحیح نیست، Matlab با صرف زمان در نوع uint8 باید مقادیر اعشاری را به مقادیر صحیح تبدیل کند و این علت افزایش زمان است.
به طور کلی، یکی از شایع ترین وضعیت هایی که شما باید کلاس داده های خود را ارتقا دهید، زمانی است که میانگین گیری انجام می دهید و این به دو دلیل است؛ که در ادامه توضیح داده می شود.
- اگر تعداد زیادی از تصاویر uint8 را میانگین میگیرید، باید تمام پیکسل ها را با هم جمع کنید. بسته به تعداد تصاویری که شما جمع میکنید، ارزش نهایی تمام پیکسلهای جمع شده اشباع خواهد شد و از اندازه نوع داده بزرگتر می شود؛ بنابراین اگر اطلاعات کل را به درستی ذخیره نکنید، برخی اطلاعات ارزشمند را از دست خواهید داد.
- هنگام ایجاد تصویر میانگین نهایی، شما باید یک تقسیم انجام دهید که باید یک عدد حقیقی ایجاد کند. از آنجا که شما به طور متوسط تصاویر زیادی دارید، وضوح تصویر نهایی باید بهتر از تصویرهای قبلی باشد؛ بنابراین، نتیجه نهایی را در یک نوع داده دقیقتر و بالاتر حفظ کنید تا مطمن باشید که نتیجه می تواند فراتر از وضوح تصویر اولیه باشد (حتی اگر تصاویر شما با ۸ بیت ذخیره شوند، می توانید تصاویر ۱۲ یا حتی ۱۶ بیتی بدست آورید). این تکنیکی است که به طور گسترده در میکروسکوپ (به ویژه تصویربرداری دانشمندان برای علوم اعصاب) استفاده می شود.
حتما بخوانید: آموزش مثالی ساده از برنامه نویسی در نرم افزار متلب (ویدیو)
انتخاب نوع داده مناسب به همین دلیل بسیار وابسته به نوع محاسبات شما است. هنگامی که تصمیم گرفتید، نوع داده را متناسب انتخاب کنید، با این کار می توانید برنامه های خود را سریعتر و با استفاده از حافظه کمتر اجرا کنید.