]-->lang="fa-IR"> آموزش ساده و کامل عملیات منطقی در نرم افزار متلب | مرکز درس

آموزش عملیات منطقی در نرم افزار متلب

در این مقاله از مرکز درس، در ادامه آموزش نرم افزار متلب، در مورد عملیات منطقی در این نرم افزار صحبت می کنیم و نحوه استفاده از مهارت های 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)

حال ادامه عملیات را با استفاده از یک حلقه تکرار ادامه می دهیم:

۱

۲

۳

۴

۵

۶

۷

۸

Costs100to300=[];

for i=1:length(Nov28Expenses)

   if Nov28Expenses(i)>=100 & Nov28Expenses(i)

      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

اجازه بدهید آن را آنالیز کنیم

>> Nov28Expenses

Nov28Expenses =

۲۰۰   ۱۰۰   ۶۰   ۵۰۰   ۳۰   ۲۰   ۶۰   ۱۵۰   ۲۱۰

>>Nov28Expenses>=100 & Nov28Expenses

ans =

۱     ۱     ۰     ۰     ۰     ۰     ۰     ۱     ۱

تابع find مقادیر عددی مورد نظر را بصورت زیر بر میگرداند:

>> find(Nov28Expenses>=100 & Nov28Expenses

ans =

۱ ۲ ۸ ۹

همه اینها در یک فرمان انجام شد.

اکنون این دستور را امتحان کنید. این نیز دقیقا همان نتیجه را می دهد

۱

Costs100to300=Nov28Expenses(Nov28Expenses>=100 & Nov28Expenses

توجه کنید که در این مورد، تابع جستجو مورد نیاز نیست. MATLAB به طور خودکار این شاخص ها را انتخاب می کند که منطقی است.

می توانید عملیات پیچیده تر را با نمایه سازی منطقی امتحان کنید.

فرض کنید شما می خواهید بدانید چقدر می توانید با کاهش ۱۰٪ قیمت تمام اقلام صرفه جویی کنید. با این حال می دانید که نمی توانید ۵۰۰ دلار اجاره را کاهش دهید، بنابراین شما باید چیزی شبیه به این را انجام دهید:

۱

۲

۳

۴

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 باید مقادیر اعشاری را به مقادیر صحیح تبدیل کند و این علت افزایش زمان است.

به طور کلی، یکی از شایع ترین وضعیت هایی که شما باید کلاس داده های خود را ارتقا دهید، زمانی است که میانگین گیری انجام می دهید و این به دو دلیل است؛ که در ادامه توضیح داده می شود.

  1. اگر تعداد زیادی از تصاویر uint8 را میانگین میگیرید، باید تمام پیکسل ها را با هم جمع کنید. بسته به تعداد تصاویری که شما جمع میکنید، ارزش نهایی تمام پیکسلهای جمع شده اشباع خواهد شد و از اندازه نوع داده بزرگتر می شود؛ بنابراین اگر اطلاعات کل را به درستی ذخیره نکنید، برخی اطلاعات ارزشمند را از دست خواهید داد.
  2. هنگام ایجاد تصویر میانگین نهایی، شما باید یک تقسیم انجام دهید که باید یک عدد حقیقی ایجاد کند. از آنجا که شما به طور متوسط ​​تصاویر زیادی دارید، وضوح تصویر نهایی باید بهتر از تصویرهای قبلی باشد؛ بنابراین، نتیجه نهایی را در یک نوع داده دقیقتر و بالاتر حفظ کنید تا مطمن باشید که نتیجه می تواند فراتر از وضوح تصویر اولیه باشد (حتی اگر تصاویر شما با ۸ بیت ذخیره شوند، می توانید تصاویر ۱۲ یا حتی ۱۶ بیتی بدست آورید). این تکنیکی است که به طور گسترده در میکروسکوپ (به ویژه تصویربرداری دانشمندان برای علوم اعصاب) استفاده می شود.

انتخاب نوع داده مناسب به همین دلیل بسیار وابسته به نوع محاسبات شما است. هنگامی که تصمیم گرفتید، نوع داده را متناسب انتخاب کنید، با این کار می توانید برنامه های خود را سریعتر و با استفاده از حافظه کمتر اجرا کنید.

بیشتر بخوانید :   آموزش گوگل مپ در HTML
ساسان سروشه

نوشته‌های مرتبط

دیدگاه‌ها

*
*