حسین خسروی

وبلاگ دانشگاهی حسین خسروی، عضو هیات علمی دانشگاه صنعتی شاهرود

حسین خسروی

وبلاگ دانشگاهی حسین خسروی، عضو هیات علمی دانشگاه صنعتی شاهرود

حسین خسروی

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

پیوندهای روزانه

۶ مطلب در آبان ۱۳۹۶ ثبت شده است

  • ۰
  • ۰

1-4 ماشین حساب با استفاده از switch-case

ماشین حساب ساده

می خواهیم شبیه تمرین سری اول، یک ماشین حساب بسازیم به این ترتیب که کاربر یک عملگر ( + - * / %) و دو عدد اعشاری وارد می کند و شما باید با switch-case نتیجه عملیات را نشان دهید. اگر عملگر اشتباه وارد شد، پیام مناسب داده و دوباره داده ها را دریافت کنید. برای شروع، می توانید از تکه کد زیر استفاده کنید:

    char operator;
    printf("Enter an operator (+, -, *, /, %): ");
    scanf("%c", &operator);

-------------------------------------------------------------------------------

2-4 کار با عملگرهای بیتی

bitwise operators - عملگرهای بیتی

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

الف) آن را با اعداد (0x00FF و 0xFF00) AND کند. (عملگر AND بیتی & است)

ب) آن را با اعداد (0x00FF و 0xFF00) OR کند. (عملگر OR بیتی | است)

ج) آن را به اندازه هشت بیت به سمت راست شیفت دهد. (عملگر شیفت به راست << است. البته این عملگر را از اینجا کپی نکنید چون برعکس تایپ شده تا در وبلاگ درست دیده شود!) مثلا برای شیفت عدد y به اندازه 8 بیت به یکی از دو صورت زیر عمل می کنیم:

y = y >> 8;

y >>= 8;

د) آن را به اندازه هشت بیت به سمت چپ شیفت دهد. (عملگر شیفت به چپ >> است.)

ه) در انتها نیبل پایین و نیبل بالای عدد ورودی را به کمک چهار بخش قبلی حساب کرده و نمایش دهید. منظور از نیبل پایین و بالا یعنی 8 بیت کم ارزش و باارزش؛ مثلا برای عدد 0x64E5 نیبل پایین برابر است با E5 و نیبل بالا برابر است با 64


تمام نتایج را ترجیحا در قالب جدول نشان دهید.

موعد تحویل: 6 آذر

  • حسین خسروی
  • ۰
  • ۰

تخمین تابع با استفاده از RBF و SOM

تابعی شامل ترکیب چهار گاوسی با پارامترهای مختلف ایجاد کنید (چیزی شبیه شکل زیر البته با 4 قله!). تعداد 100 زوج (x,y) از این فضا (در بازه 5- تا 5+) به عنوان نقاط آموزش انتخاب کنید. دقت کنید که توزیع نمونه‌ها متناسب با توابع گاوسی باشد (برای این کار می‌توانید از randn کمک بگیرید).

  • الف) با استفاده از توابع آماده متلب شبکه som را برای 4 نرون، 12 نرون و 40 نرون روی این نمونه‌ها (مختصات x و y نمونه‌های آموزش) اجرا کنید و بردارهای مراکز به دست آمده را برای استفاده در مرحله بعد ذخیره کنید (در فایل گزارش، موقعیت وزنهای نهایی نمایش داده شود).

  • ب) با استفاده از شبکه RBF با روش یادگیری ماتریس شبه‌معکوس تابعی از این نقاط عبور دهید (از newrb استفاده نکنید و روابط آن را پیاده سازی کنید). تعداد نرونهای لایه‌ی مخفی را 12 نرون انتخاب کنید و برای مقدار دهی اولیه بردارهای مراکز، یکبار به صورت تصادفی از فضای ورودی و یک بار از خوشه‌یابی (نتایج قسمت الف) استفاده کنید. برای پارامتر پراکندگی خودتان تصمیم گیری کنید.

  • ج) قسمت ب) را با استفاده از newrb پیاده سازی کنید و نتایجتان را مقایسه کنید.

  • د) قسمت ب را برای 3 نرون و 40 نرون مخفی هم تکرار کنید و خطای مجموع (روی 100 نمونه آموزش) را در یک جدول با هم مقایسه کنید.

  • ه) تابع تخمین زده شده را در تمام حالتها با استفاده از توابع meshgrid و surf در بازه بین 5- تا 5+ رسم کنید.

radial basis function radial basis function

 

زمان و نحوه ارسال برنامه

موعد ارسال تمرین:  10 آذر
نحوه ارسال: فایلهای متلب یا C به علاوه یک فایل word شامل اطلاعات نویسندگان، کد نوشته شده و نتایج به دست آمده.

  • حسین خسروی
  • ۰
  • ۰

1. کار با توابع

1. برنامه‌ای شامل سه تابع به شرح زیر بنویسید:
‌أ.    تابع اول با نام ReverseNumber که یک عدد صحیح با تعداد ارقام نامعلوم دریافت کرده و معکوس آن را برگرداند مثلا به ازای 123456 باید عدد 654321 را برگرداند. (دقت کنید که عدد دریافت کند نه رشته. ضمنا تابع باشد نه اینکه داخل main یک برنامه بنویسید)

‌ب.    تابع دوم با نام ToUpper که یک رشته (char *) دریافت کرده و رشته متناظر آن با حروف بزرگ را برگرداند. مثلا اگر عبارت Peace Upon You O Aba-Abdellah  را بدهیم باید عبارت PEACE UPON YOU O ABA-ABDELLAH را تحویل دهد.

‌ج.    تابع سوم با نام Sort که یک آرایه‌ی اعشاری و طول آن را دریافت کرده و آن را از بزرگ به کوچک مرتب کند. دقت کنید که این تابع خروجی ندارد و در واقع خود آرایه ورودی را تغییر می دهد. امضای تابع می تواند به یکی از دو صورت زیر باشد:

void Sort(double* data, int length);
void Sort(double data[], int length);


(نکته: این سه تابع را باید قبل از main تعریف کنید یا اینکه امضای آنها را قبل از main و بدنه آنها را بعد از main تعریف کنید)
در قسمت main برنامه ای بنویسید که ابتدا یک عدد گرفته و به کمک تابع اول، معکوس آن را برگرداند، سپس یک رشته دریافت کرده و به کمک تابع دوم آن را به حروف بزرگ تبدیل کرده و نمایش دهد و در انتها یک آرایه‌ی 5 تایی گرفته و آن را مرتب کرده و نمایش دهد.

2. پیاده سازی تابع میانگین متحرک (Moving Average)

تابعی با نام smooth بنویسید که یک آرایه و طول آن را به عنوان ورودی بگیرد و عناصر آرایه را با تغییر دهد به این ترتیب که به جای عنصر k ام، میانگین سه عنصر (k-1, k, k+1) را جایگزین کند. این تابع هم خروجی ندارد و در واقع داده های خود آرایه ورودی را عوض می کند:

void Sort(double* data, int length);
void Sort(double data[], int length);
به عنوان مثال اگر آرایه ورودی به صورت زیر باشد:
{10, 15, 11, 9, 8}
خروجی زیر حاصل می شود (عنصر اول و آخر تغییر نمی کند):

{10, (10+15+11)/3, (15+11+9)/3, (11+9+8)/3, 8}


تابع میانگین متحرک Moving Average Function

تابع میانگین متحرک Moving Average Function


حالا برنامه ای بنویسید که آرایه عددی A را از فایل (data.txt) بخواند و تابع smooth راروی آنها اجرا کند و در نهایت در فایل دیگری (output.txt) آرایه های تغییر یافته را ذخیره کند.
اگر با متلب یا اکسل می توانید کار کنید، این دو آرایه را قبل و بعد از اعمال smoothing ترسیم کنید (در متلب با دستور plot).

موعد تحویل 1 آذر ماه

  • حسین خسروی
  • ۰
  • ۰

#CPP_or_Python ?

تجربه یک برنامه نویس خبره در سایت StackOverFlow در مورد پایتون و سی پلاس پلاس


https://stackoverflow.com/questions/801657/is-python-faster-and-lighter-than-c


1. My experiences with Python show the same definite trend that Python is on the order of between 10 and 100 times #slower than C++ when doing any serious #number_crunching. There are many reasons for this, the major ones being: 

a) Python is #interpreted, while C++ is #compiled; 

b) Python has no #primitives, everything including the builtin types (int, float, etc.) are #objects; 

c) a Python list can hold objects of #different type, so each entry has to store additional data about its type. These all severely hinder both runtime and #memory consumption.


This is no reason to ignore Python though. A lot of software doesn't require much time or memory even with the 100 time slowness factor. #Development_cost is where #Python #wins with the simple and concise style. This improvement on development cost often outweighs the cost of additional cpu and memory resources. When it doesn't, however, then C++ wins.


پاسخ یک پایتون کار به این تجربه:

2. All the slowest (>100x) usages of Python on the shootout are scientific operations that require high GFlop/s count. You #should_NOT use python for those anyways. The correct way to use python is to #import a #module that does those calculations, and then go have a relaxing afternoon with your family. That is the pythonic way :)


خلاصه کلام اینکه، در پایتون فرایند توسعه برنامه، خیلی سریعتر است، اما سرعت اجرا برنامه بسیار کمتر از برنامه C++ است (10 برابر کندتر) . البته سرعت کمتر را با نوشتن ماژولهای محاسباتی در C++ و import کردن آنها در پایتون می شود جبران کرد!


http://sapp.ir/khosravi


پی نوشت (26 اسفند 96): تجربه عملی خودم را در مورد مقایسه این دو زبان ببینید: C++ یا پایتون

  • حسین خسروی
  • ۰
  • ۰

 الف) شناسایی چهره

تمرین سری دوم را روی شناسایی چهره از مجموعه ORL تکرار کنید. برای استخراج ویژگی حتما از ویژگیهایی غیر از میانگین بلوکی استفاده کنید، مثلا هیستوگرام گرادیان یا PCA یا Harr-like یا تبدیل فوریه یا ... (کد استخراج ویژگی را می توانید از وب تهیه کنید). 50% داده ها برای آموزش، 50% برای آزمایش. برای دانلود مجموعه ORL اینجا را کلیک کنید.

ب) تخمین تابع

1.    شبکه‌ی MLP که قبلا پیاده سازی کرده‌اید را به گونه‌ای تغییر دهید که تابع فعالسازی لایه‌ی خروجی آن خطی باشد.
2.    تعدادی نقطه از یک منحنی نویزی استخراج کنید و به عنوان نمونه‌های آموزش استفاده کنید؛ به یک تابع مرتبه 4 یا بالاتر مقداری نویز اضافه کرده و سپس چند نقطه (مثلا 40 نقطه) از آن را به عنوان نمونه‌های آموزش به شبکه MLP بدهید (مثل نقاط آبی رنگ در منحنی زیر).

3.    تابع تخمین زده شده را نمایش دهید (مثل منحنی قرمز رنگ در شکل)

تخمین تابع - Function Approximation

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

‌    استفاده از تابع newff متلب یا کتابخانه‌های آماده مثل opencv مجاز نیست و شبکه‌ی MLP را به طور کامل باید خودتان پیاده سازی کنید.
•    الزامی نیست که تابع مورد نظر الگوی مشخصی داشته باشد؛ مثلا می تواند تعداد نقاط مشخص شده توسط کاربر باشد که البته پیچیدگی کافی داشته باشد.
•    این تمرین را می‌‌توانید یک یا دو نفره انجام دهید.

زمان و نحوه ارسال برنامه

موعد ارسال تمرین: 20 آبان ماه

نحوه ارسال: فایلهای متلب یا C به علاوه یک فایل word شامل اطلاعات نویسندگان، کد نوشته شده و تابع به دست آمده.

khosravi.blog.ir

  • حسین خسروی
  • ۰
  • ۰
تمرین سری دوم را از این آدرس دانلود کنید. موضوع این تمرین شناسایی الگو به کمک شبکه MLP است.

موعد تحویل 10 آبان

  • حسین خسروی