تفاوت حافظه های DDR3 و GDDR5

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

- مصرف بالاتر و تولید گرمای بیشتر DDR3 نسبت به GDDR5 .  (مصرف 1.2 تا 1.65 ولت DDR3 نسبت به حدود 1 ولت GDDR5)

- DDR3 از کنترلر حافظه 64 بیتی برای هر کانال استفاده می کند (128 برای دو کانال، 256 برای چهار کانال و ...) در حالی که GDDR5 از کنترلر های 32 بیتی (16 بیت برای ورودی/ 16 بیت خروجی) استفاده می کند. البته GPU میتواند از هر تعداد ورودی/خروجی 32 بیتی استفاده کند. (2 عدد برای 64 بیت، 4 برای 128 بیت، 6 برای 192 بیت و ...)

- فرکانس و پهنای باند بالاتر GDDR5 نسبت به DDR3.

- تاخیر (latency) بیشتر GDDR5 نسبت به DDR3.

به علت تفاوت ذاتی CPU و GPU در پردازش و توانایی بالای GPU در موازی کاری، تاخیر حافظه های GDDR5 اهمیتی برای GPU ندارد و در عوض توانایی حافظه GDDR5 در انتقال سریع حجم عظیم اطلاعات باعث می شود که برای GPU ها از این حافظه استفاده شود؛ در طرف مقابل نیاز CPU به انجام سریع پردازشات خطی، تاخیر کم حافظه های DDR3 و انتقال سریع حجم کم اطلاعات، یک مزیت برای DDR3 به حساب می آید.  



سربارگذاری عملگر ورودی و خروجی << >> در زبان C++


شاید گاهی لازم باشد عملکرد عملگر های ورودی و خروجی را در برنامه های خود (معمولا برنامه های کنسولی) به صورت دلخواه تغییر دهیم تا بتوانیم آنها را برای اشیاء کلاس هایمان به صورت صحیح کار ببریم. سربارگذاری عملگر های ورودی و خروجی را در این پست با یک نمونه ساده در مورد "تاریخ" (date) نشان داده شده است. به کلاس ساده زیر توجه کنید.

class date
{
public:
int day, month, year;

date (int day, int month, int year)
{
   this->day = day;
   this->month = month;
   this->year = year;
}
};

کلاس date دارای سه عضو عمومی برای روز، ماه و سال است و یک سازنده برای مقدار دهی این اعضا دارد. البته اعضای کلاس معمولا باید به صورت خصوصی تعریف شوند ولی ما در این مین مثال ساده ترین گزینه را در نظر می گیریم. سربارگذاری عملگر های ورودی و خروجی باید در بیرون کلاس صورت گیرند. در ادامه به ترتیب سربارگذاری برای عملگر ورودی و خروجی تعریف شده است. ما می خواهیم که بتوانیم تاریخ را به صورت یکجا (مثلا 22/3/1396 وارد کنیم یا در خروجی چاپ کنیم، پس باید این عملگر های را به گونه ای که مورد نظر ماست دستکاری کنیم).


istream &operator>> (istream &output, date &day)
{
  char slash;
  output >> day.day >> slash >> day.month >> slash >> day.year;
  return output;
}

ostream &operator<< (ostream &output, date day)
{
  return output << day.day << "/" << day.month << "/" << day.year;
}

عملگر << از نوع istream و عملگر >> از نوع ostream است. برای همین نوع بازگشتی توابع را از این انواع تعیین می کنیم. این توابع باید دارای دو پارامتر باشند که پارامتر اول شیئی از نوع ذکر شده برای خروجی است و پارمتر دوم شیئی از کلاس date است که دربردارنده سه عضو روز، ماه و سال است. اگر این اعضا خصوصی تعریف شده بود باید از توابع دستیابی برای دسترسی به آنها استفاده می کردیم ولی چون اینجا اعضا، عمومی هستند نیازی به این کار نیست.

تابع اول به نحوی تعریف شده است که روز، ماه و سال را یکجا از از کاربر دریافت می کند و مقدار آنها را در متغیر های عضو قرار می دهد؛ کاراکتر اسلش / به عنوان جدا کننده انها به کار رفته است همانطور که هنگام نوشتن تاریخ از آن برای جدا کردن روز، ماه و سال استفاده می کنیم. تابع دوم ساده تر از تابع اول است و تنها سه متغیر عضو را همراه با کاراکتر اسلش برای جداسازی در خروجی چاپ می کند. حالا می توانیم این این دو عملگر را برای اشیاء کلاس date به صورت مستقیم به کار ببریم و تاریخ را یکجا از ورودی دریافت یا در خروجی نمایش دهیم.  

 

Two Steps From Hell


Two Steps From Hell یا "دو قدم تا دوزخ" کمپانی تهیه کننده موسیقی واقع در لس آنجلس کالیفرنیا است که به وسیله دو آهنگساز به نام های Nick Phoenix و Thomas J. Bergersen در سال 2006 تاسیس شده است. این کمپانی برای تریلر (پیش نمایش) فیلم ها، برنامه های تلویزیونی و بازی های ویدئویی، موسیقی تهیه می کند.

در طی چند سال این گروه برای صد ها تریلر موسیقی تهیه کرده است که بسیاری از انها جزء بزرگترین بلاک باستر های دهه اخیر هستند. از جمله این فیلم ها و بازی ها می توان به سری فیلم های هری پاتر، دزدان دریایی کارائیب، بتمن، گرگ و میش، مردان ایکس، و سرآغاز، ترون، استار ترک، جایی برای پیرمرد ها نیست و ... و بازی هایی مانند مس افکت، کیلزون (قتلگاه)، جنگ ستارگان و ... اشاره کرد.  

نصب  Net Framework 3.5 / 3 / 2 بر روی ویندوز 8 (windows 8)


به صورت پیشفرض نسخه های 3.5 ، 3 یا 2 چهار چوب .Net بر روی ویندوز 8 نصب نیستند و بسیاری از برنامه ها نیز به این نسخه ها برای اجرا نیازمند هستند؛ ولی میتوانید خیلی ساده این نسخه ها را بر روی ویندوز 8 نصب کنید. برای این کار می توانید از دو روش آنلاین یا دیسک نصب ویندوز استفاده کنید.

روش انلاین :

به کنترل پنل ویندوز رفته و وارد قسمت Programs and Features شوید و گزینه Turn Windows features on or off را انتخاب کنید. سپس تیک گزینه .NET Framework 3.5 را بزنید و Ok را کلیک کنید. پس از تایید دانلود فریمورک از اینترنت، به صورت خودکار فایل های موردنیاز دانلود شده و نصب می شوند.

روش افلاین : (استفاده از دیسک نصب ویندوز)
دیسک را در درایو قرار دهید و سپس به Command Prompt ویندوز رفته (با اختیارات Administrator) و دستور زیر را تایپ یا کپی کنید و enter را بزنید و صبر کنید تا مراحل نصب تکمیل شوند. 


Dism.exe /online /enable-feature /featurename:NetFX3 /All /Source:E:\sources\sxs /LimitAccess


به قسمت E:\source\sxs دقت کنید. این پوشه در دیسک نصب ویندوز قرار دارد و لازم است این آدرس به نسبت به نام درایو دی وی دی شما تغییر کند. برای مثال اگر "G" درایو دی وی دی شما است، آن را به       G:\source\sxs تغییر دهید.  

سربارگذاری عملگر تساوی ( == )


این پست مثالی از سربارگذاری عملگر تساوی یا == در زبان C++ است. سربار گذاری این عملگر می تواند در داخل یا خارج از کلاس موردنظر انجام شود؛ به این معنی که تابع سربارگذاری تابع عضو کلاس باشد یا خیر. برای این مثال ما سربارگذاری را در خارج از کلاس انجام می دهیم و در فضای عمومی برنامه تابع خود را قرار می دهیم.

تفاوت سربارگذاری در داخل یا خارج از کلاس (تابع عضو یا غیر عضو) :

تفاوت اینکه تابع را در کلاس تعریف کنید یا خیر این است که هنگامی که در تابع در کلاس تعریف می شود اولا به اعضای خصوصی دسترسی دارید و دوما تابع شما تنها یک پارامتر را می پذیرد که آن عملوند طرف راست عملگر == است و عملگر this به عملوند طرف چپ == اشاره دارد. ولی تابعی که در خارج از کلاس تعریف شده باشد مانند مثال زیر نیازمند دو پارامتر است که اولی عملوند طرف چپ و دومی عملوند طرف راست == هستند.
کلاس زیر را در نظر بگیرید : (من همیشه سعی می کنم تا ساده ترین حالت ممکن را در مثال ها، عنوان کنم تا ذهن خواننده درگیر مسائل فرعی نشود)


class students
{
public:
  int num;
  string name , family;
};

students کلاسی برای ذخیره نام، نام خانوادگی و شماره یک دانش آموز است. فرض کنید دو شی یا دو دانش آموز از کلاس بالا در اختیار دارید و می خواهید یکسان بودن آنها را به صور مستقیم با عملگر == بررسی کنید. اگر این مثال را نمی پسندید می توانید کلاسی را برای تاریخ یا درامد یا هر چیز دیگری تصور کنید...

students stu1, stu2;
stu1.name = "ali"; stu2.name = "hossein";
stu1.familiy = "rahimi"; stu2.family = "rajabi";
stu1.num = 15452214; stu2.num = 15426444;

اگر بخواهید این دو دانش آموز را به صورت مستقیم با یکدیگر مقایسه کنید چون عملگر == با کلاس شما مطابقت ندارد، با پیغام خطای کامپایلر مواجه می شوید.

if (stu1 == stu2) // Error
{
  // do something
}

راه حل سربار گذاری عملگر == برای کلاس students است. تابع سربارگذاری عملگر == دارای دوپارامتر const یا "ثابت" است که در مورد آنها توضیح دادیم. نوع این بازگشتی این تابع bool یا منظقی است چون قرار است یک مقدار true یا false را برگرداند و بدنه آن (در این مثال) بررسی هر سه متغیر عضو کلاس برای دو شی ارسال شده است.

bool operator== (const students &stu1, const students &stu2)
{
     if (stu1.name == stu2.name
         && stu1.family == stu2.family
          && stu1.num == stu2.num)
     { 
        return true;
     }
    return false; 
}

یا به صورت بهتر :


bool operator== (const students &stu1, const students &stu2)
{
return (stu1.name == stu2.name
          && stu1.family == stu2.family
           && stu1.num == stu2.num);
}

حالا میتوان با این تابع، به صورت مستقیم عملگر == را برای اشیای کلاس students به کار برد. حالا که سربارگذاری عملگر == را انجام دادیم، باید بتوانیم سربارگذاری عملگر =! را به همین صورت انجام دهیم. 

جست و جو و مرتب سازی در vector

 
در زبان C++ دو تابع پیش ساخته را می توانیم برای جست و جو و مرتب سازی وکتور به کار ببریم. واضح است که استفاده از توابع پیش ساخته در بسیاری مواقع به توابع شخصی ارجحیت دارد.

مرتب سازی وکتور :
برای مرتب سازی وکتور از تابع sort استفاده می کنیم که در کتابخانه algorithm نوشته شده است و حالت کلی آن به صورت زیر است.


// #include < algorithm >

sort (Beginning, End);

تابع sort دو پارامتر دارد که ابتدا و انتهای بازه مورد نظر برای مرتب سازی را مشخص می کند. دو تابع begin و end ایندکس ابتدا و انتهای وکتور را برمی گردانند. اگر وکتور numbers را در مثال زیر در نظر بگیریم، مرتب سازی کل وکتور به صورت زیر خواهد بود.


vector < int > numbers (100);
sort (numbers.begin(), numbers.end());

با این کار کل عناصر ویکتور از کوچک به بزرگ مرتب خواهند شد. مرتب سازی می تواند از هر بازه دلخواهی صورت گیرد. برای این کار می توانید از پارامتر های begin و end مقدار دلخواه را کم یا زیاد کنید تا محدوده دلخواه شما مشخص شود. برای مثال مرتب سازی نیمه اول وکتور به صورت زیر خواهد بود.

sort (numbers.begin(), numbers.end() - 50);


جست و جو در وکتور :

جست و جو در وکتور میتواند به سادگی با یک الگوریتم جست و جوی خطی انجام شود. ولی ما در این جا از تابع find از کتابخانه استاندارد C++ استافده می کنیم که حات کلی آن به صورت زیر است و در کتابخانه algorithm نوشته شده است.


// #include < algorithm >
find (Beginnig, End, Value);

دو پارامتر اول، نقطه شروع و پایان جست و جو و پارمتر سوم مقداری است که در وکتور به دنبال آن می گردیم. برای مثال در وکتور numbers کد زیر وجود مقدار 124 را در وکتور بررسی می کند.


if (find (numbers.begin(), numbers.end(), 124) != numbers.end())
{
  cout << "found";
}
else
{
  cout << "not-found";
}

تابع find مقدار صحیح یا غلط را برنمیگرداند، در عوض مقداری از نوع iterator را برمیگرداند که ایندکس اولین خانه است که مقدار ارسال شده در آن یافته شده است. و اگر این مقدار اصلا یافته نشد حد بالا بازه جست و جو + یک ، را برمی گرداند. پس حالا که ما در کل وکتور جست و جو را انجام می دهیم، اگر جست و جو موفقیت آمیز نباشد(مقدار ارسال شده یافته نشود) ایندکس آخرین خانه وکتور + یک (numbers.end() + 1) یا اندازه ویکتور (numbers.size()) برگردانده می شود.
اگر خواسته باشید ایندکس خانه ای که یافته شده است را به دست اورید می توانید به صورت زیر عمل کنید.

int index = find (numbers.begin(), numbers.end(), 124) - numbers.begin();

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

 

دانلود مستند Five Broken Cameras 2011


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


موضوع این مستند که به وسیله دو مستند ساز فلسطینی و اسرائیلی به نام های Emad Burnat و Guy Davidi ساخته شده است، در مورد استقامت مردم روستایی به نام "بلعین" در کرانه غربی برابر ارتش اسرائیل است. استقامت و روحیه مردم این روستا مثال زدنی و قابل تحسین است و مانند بسیاری دیگر از فیلم های مستند این "حقیقت" است که بیننده را تا پایان مجذوب خود نگه می دارد...

Type Safety چیست ؟

 

type safety یا به فارسی "اطمینان نوع" قابلیت یا ویژگی یک زبان برنامه نویسی برای جلوگیری یا کاهش رخدادن خطاهای "عدم تطابق نوع" یا Type Errors در برنامه است. عدم تطابق نوع، به رفتار ناخواسته و نامطلوب یک برنامه به دلیل اختلاف در انواع داده ای در متغیر ها، ثابت ها یا توابع برنامه، گفته می شود. برای مثال رفتار کردن با یک متغیر نوع صحیح (integer) مانند یک متغیر نوع ممیز شناور (float).

یک زبان برنامه نویسی ممکن است خطاهای بالقوه را در هنگام کامپایل مشخص کند یا اطلاعات انواع را در زمان اجرا با مقدار ها بررسی کند تا خطاهای قریب الوقوع را مشخص کند یا ترکیبی از این دو نوع باشد. type safety گاهی اوقات نه به عنوان یک ویژگی زبان برنامه، بلکه به عنوان ویژگی برنامه نوشته شده یاد می شود؛ به این دلیل که برخی از زبان های برنامه نویسی امکاناتی برای برنامه نویسیان فراهم کرده اند تا برنامه نویسان بتوانند از آن در برنامه های خود استفاده کنند.


ساختار vector در زبان C++


در زبان برنامه نویسی C++ ، وکتور (vector) ساختاری است که به شما اجازه می دهد چندین مقدار یا ارزش را تحت یک نام ذخیره و استفاده کنید؛ بر خلاف متغیر ها که تنها اجازه ذخیره یک مقدار تحت یک نام را می دهند. وکتور را میتوانید مانند آرایه تصور کنید که دارای خانه هایی مشخص و پشت سر هم است و در هر کدام از انها می تواند یک مقدار ذخیره شود و برای دسترسی به این خانه ها از ایندکس آنها که از صفر شروع می شود، استفاده می شود.
تعریف یک وکتور :
پیش از هر کاری، برای استفاده از این ساختار باید کتابخانه vector را به برنامه خود اضافه کنید. حالت کلی تعریف وکتور به صورت زیر است :


// add vector lib to program
#include

// declaration
vector < TYPE > NAME;

خط بالا یک وکتور را به کلی ترین حالت ممکن تعریف می کند. پس تعریف به این صورت است که پس از کلمه vector در بین دو علامت < > ، نوع داده ای وکتور اعلان می شود و پس از آن نام وکتور مشخص می شود.
برای مثال کد زیر را در نظر بگیرید که وکتوری به نام numbers از نوع int یا صحیح تعریف می کند که در طول پست برای ذکر مثال از آن استفاده می کنیم.


vector < int > numbers;

مشخص کردن تعداد خانه ها یا عناصر وکتور در هنگام تعریف :

vector < TYPE > NAME (SIZE);

در این صورت وکتوری با تعداد عناصر یا خانه های مشخص شده به صورت SIZE ایجاد می شود و به عبارت دیگر اندازه وکتور به تعداد مشخص شده محدود می شود.

تعیین مقدار اولیه یا پیشفرض عناصر وکتور در هنگام تعریف :

vector < TYPE > NAME (SIZE , Default_Value);

در این صورت وکتوری با اندازه مشخص شده ایجاد می شود که عناصر آن همگی به صورت پیشفرض دارای مقدار تعریف شده Default_Value هستند.

دسترسی و مقدار دهی به عناصر وکتور :
برای دسترسی به عناصر وکتور از ایندکس یا شماره خانه هر عنصر استفاده می کنیم. برای مثال برای وکتور numbers مقدار دهی یا خواندن سه عنصر اول به صورت زیر خواهد بود.

numbers[0] = 100;
numbers[1] = 200;
numbers[2] = 300;
..........
cout << numbers[0];
cout << numbers[1];
cout << numbers[2];


مقدار دهی با استفاده از تابع push_back :
تابع push_back مقدار ارسال شده را در اولین خانه در دسترس (خالی) وکتور قرار می دهد. بنابراین اگر برای اولین بار از این تابع استفاده کنیم مقدار ارسال شده در خانه اول ( ایندکس 0 ) وکتور قرار می گیرد. (چون وکتور تا به حال مقدار دهی نشده باشد) و برای بار های بعد مقدار ارسال شده در خانه های بعدی قرار خواهند گرفت. فرض کنید خط زیر را برای وکتور numbers به کار ببریم :

numbers.push_back (400);

در این صورت مقدار 400 در خانه چهارم این وکتور قرار می گیرد چون سه خانه اول قبلا (در کد های بالا) اشغال شده بوده اند و خانه چهارم اولین خانه ی در دسترس برای ذخیره این مقدار است.

حذف اخرین عنصر وکتور با استفاده از تابع pop_back :
تابع pop_back آخرین خانه اشغال شده وکتور را خدف (خالی) می کند. ولی دقت کنید که مقدار این خانه را بر نمی گرداند. برای مثال کد زیر، مقدار 400 را از خانه چهارم وکتور numbers حذف می کند.

numbers.pop_back();



برنامه محاسبه معکوس ماتریس n * n ( زبان C# )


در پست های قبل نحوه به دست آوردن معکوس یا واران یک ماتریس 3 در 3 یا بیشتر و همچنین شروط آن را یادآوری کردیم. در این پست هم برای کسانی که مانند من علاقه دارند برنامه محاسبه را خودشان به صورت دلخواه بنویسند، نکاتی را توضیح خواهیم داد. هدف اصلی من از این چند پست، افزایش مهارت در برنامه نویسی با بهانه تعیین معکوس یا واران یک ماتریس بود که سوژه خوبی برای برنامه نویسی در سطوح مقدماتی است؛ در این میان یک یادآوری هم از دروس دوران دبیرستان شد. در انتهای پست نیز میتوانید نسخه ای از برنامه ای که من برای این چند پست نوشته ام را داشته باشید. که به احتمال زیاد بدون مشکل نخواهد بود.

اولین کار برای محاسبه معکوس ماتریس به دست آوردن ماتریس الحاقی است. ماتریس الحاقی ماتریسی هم مرتبه ماتریس ورودی است که درایه های آن از انجام 3 عملیات زیر به دست می آید :

1 : هر درایه برابر است با کهاد ماتریس نسبت به سطر و ستون آن درایه.
2 : درایه های ماتریس با شرط اینکه، "اگر سطر + ستون درایه یا i+ j فرد بود" تغییر علامت می یابند.
3 : درایه های نسبت به قطر اصلی جابه جا می شوند. مانند اینکه قطر اصلی را محور تقارن ماتریس در نظر بگیریم.
برای دو تغییر اول فرمول زیر استفاده می شود و ماتریسی که از این اعمال این دو تغییر به دست می یابد را ماتریس همسازه گفته می شود.


A i, j = (-1) ᴵ + ᴶ x | M i ,j |


من تابع محاسبه ماتریس همسازه را اینگونه نوشته ام :


private double[,] Hamsaze(double[,] matrix)
{
int Size = (int)Math.Sqrt(matrix.Length);
double[,] result = new double[Size, Size];
for (int i = 0; i < Size; i++)
{
   for (int j = 0; j < Size; j++)
   {
      result[i, j] = Math.Pow(-1, (i+1 + j+1)) * Determinant(Kehad(matrix, i, j));
   }
}
return result;
}


در این تابع دو تابع دیگر به نام Determinant و Kehad را مشاهده می کنید. که از نامشان پیداست خروجی انها چیست.
تابع دترمیان :

private double Determinant(double[,] matrix)
{
double determinant = 0;
int Size = (int)Math.Sqrt(matrix.Length);
if (Size == 1)
{
   return matrix[0, 0];
}
else if (Size == 2)
{
   return (matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0]);
}
else
{
  for (int i = 0; i < Size; i++)
     determinant += (int)Math.Pow(-1, (i + 1) + 1) * matrix[0, i] * Determinant(Kehad(matrix, 0, i));
}
return determinant;
}


تابع کهاد :


private double[,] Kehad(double[,] matrix, int ROW, int COL)
{
int Size = (int) Math.Sqrt(matrix.Length);
double[,] result = new double[Size - 1, Size - 1];
int x = -1, y = 0;
for (int i = 0; i < Size; i++)
{
   if (i == ROW)
   continue;
   x++;
   y = 0;
    for (int j = 0; j < Size; j++)
    {
      if (j == COL)
      continue;
      result[x, y++] = matrix[i, j];
    }
}
return result;
}

تابعی که برای اعمال تغییر سوم (به همراه دو تغییر اول) به کار برده ام Adjugate نام دارد و کاری که می کند، جابه جا کردن درایه های ماتریس همسازه نسبت به قطر اصلی آن است.

private double[,] Adjugate(double[,] matrix, int row, int col)
{
// first step
matrix = Hamsaze(matrix);

//second step
double temp = 0;
for (int i = 0; i < row; i++)
   {
    for (int j = i - 1; j >= 0; j--)
    {
      temp = matrix[j, i];
      matrix[j, i] = matrix[i, j];
      matrix[i, j] = temp;
    } 
   }  
return matrix;
}

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

فرمول محاسبه ماتریس معکوس : 

Inv(matrix) = 1 / Determinant(matrix)  x  Adjugate-matrix

ضرب یک عدد در ماتریس :

number : عدد مورد نظر

for (int i = 0; i < row; i++)
   for (int j = 0; j < col; j++)
   {
      matrix[i, j] *= number;
   }

در پایان می توانید از لینک زیر برنامه ی ساده ای که برای محاسبه معکوس ماتریس در محیط دات نت نوشته ام را دانلود و تست کنید. البته باید آخرین نسخه دات نت را برای اجرای این برنامه داشته باشید.

معکوس ماتریس 3 * 3 و بالاتر ( n * n )


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

پیش شرط :
همه می دانید که اولا ماتریس شما باید یک ماتریس مربعی باشد و دوما دترمینان آن مخالف صفر 0 باشد. اگر این دو شرط را رعایت کنید ماتریس شما واران پذیر خواهد بود.

محاسبه :
اگر اطلاعاتی در مورد دترمینان و ماتریس الحاقی ندارید می توانید از لینک های ابتدای پست استفاده کنید یا در اینترنت در مورد آنها جست و جو کنید چون دیگر در این پست در مورد انها صحبت نمی کنیم. فرمول زیر برای محاسبه دترمینان به کار میرود.


Inv (matrix) = 1 / Det(matrix) x Adjugate-matrix

Inv (matrix) : ماتریس معکوس
Det (matrix) : دترمینان ماتریس
Adjugate-matrix : ماتریس الحاقی


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

Effective Memory Clock چیست ؟


Effective Memory Clock یا "فرکانس موثر حافظه"، نقطه ی مقابل Real Memory Clock یا "فرکانس واقعی حافظه"، به فرکانس کلی یک حافظه تصادفی (RAM) گفته می شود که از ضرب فرکانس واقعی، در تعداد واحد های انتقال یافته اطلاعات در هر چرخه (کلاک) به دست می آید. برای مثال در رم های DDR - Double Data Rate فرکانس موثر از ضرب فرکانس واقعی در 2 به دست می آید چون این حافظه ها در هر چرخه می توانند دو واحد اطلاعات را انتقال دهند و یا در حافظه های QDR - Quad Data Rate فرکانس موثر از ضرب فرکانس واقعی در 4 به دست می آید چون این حافظه ها در هر چرخه 4 واحد اطلاعات را منتقل می کنند.    



ماتریس الحاقی


ماتریس الحاقی یا Adjugate Matrix یا Adjoint Matrix از معکوس کردن درایه های ماتریس همسازه نسبت به قطر اصلی به دست می آید.

یاد آوری ماتریس همسازه :
در پست های قبل در مورد ماتریس همسازه یا همسازه ماتریس صحبت کرده بودیم و گفته بودیم که ماتریس همسازه ماتریسی است که درایه های آن به وسیله ی فرمول زیر به دست می آید.


A i, j = (-1) ᴵ + ᴶ x | M i ,j |

که در آن M i ,j به معنی i و j اومین کهاد ماتریس مورد نظر می باشد و از حذف سطر i ام و ستون j ام ماتریس اولیه به دست می آید. پس از محاسبه تک تک درایه ها با استفاده از فرمول بالا، ماتریس همسازه ماتریس موردنظر به دست می آید.

معکوس کردن درایه ها نسبت به قطر اصلی : 

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



ماتریس به دست آمده از اعمال این تغییر را ماتریس الحاقی می گویند که در محاسبه ماتریس واران، یک ماتریس کاربرد دارد.  

فناوری GPU Boost


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


فناوری GPU Boost از شرکت Nvidia که مشابه فناوری Turbo Boost از شرکت اینتل است و احتمالا با آن بیشتر آشنا هستید، و با معماری کپلر (Kepler) این شرکت معرفی شد، یک فناوری تنظیم فرکانس یا بهتر است بگوییم اورکلاکینگ به صورت هوشمند و دینامیک است که فرکانس GPU و فرکانس رم کارت گرافیک را در بر می گیرد. این فناوری چندین پارمتر مانند دمای کنونی و آستانه تحمل تراشه، حجم کار تراشه، حجم رم استفاده شده و ... را برای تنظیم فرکانس GPU در نظر می گیرد و فرکانس را متناسب با آنها و نیاز پردازش تغییر می دهد. اورکلاکینگ دینامیک به شما اجازه می دهد تا از یک طرف از حداکثر توان کارت گرافیک در لحضاتی که نیازمند پردازش بالا هستید استفاده کنید و از طرف دیگر در مواقعی که نیاز به پردازش بالا نیست، در مصرف انرژی صرفه جویی کنید.  
src=

کاربرد دوگانه ی عملگر های & و * در زبان C++


شاید قبلا در مورد کاربرد دوگانه عملگر های & و * در زبان برنامه نویسی C++ صحبت کرده باشم ولی این پست یک یاداوری در مورد این دو عملگر است. این دو عملگر می توانند به صورت پیشوند یا پسوند به کار روند و در این صورت عملکرد های متفاوتی خواند داشت.


عملگر & به صورت پسوند نوع: (یا پیشوند متغیر در هنگام اعلان)
در این صورت، & برای تعریف یک نام مستعار یا تعریف یک پارمتر از نوع ارجاع به کار می رود. در زیر مثالی از موضوع را مشاهده می کنید.


تعریف یک نام مستعار برای یک متغیر :
int num = 100;
int& mirror = num;  // or :  int  &mirror = num; 

تعریف یک پارمتر به صورت ارجاع :
void Function (int& Parameter1);



عملگر & به صورت پشوند متغیر :
در این صورت این عملگر آدرس متغیر موردنظر را بر می گرداند. در زیر مثالی از این موضوع را مشاهد می کنید.



بازگرداندن آدرس یک متغیر :
int num = 100;
cout << & num;


عملگر * به صورت پسوند نوع : (یا پیشوند متغیر در هنگام اعلان) 

در این صورت این عملگر برای تعریف یک اشاره گر به کار می رود. در زیر مثالی از این موضوع را مشاهد می کنید.


تعریف یک اشاره گر :
int num = 100;
int* ptr = & num;  // or : int *ptr = & num;


عملگر * به صورت پشوند متغیر :
در این صورت این عملگر مقدار متغری که اشاره گر به آن اشاره می کند. برای مثال اشاره گری که در بالا تعریف کردیم را در نظر بگیرید.


بازگرداندن مقدار متغیری که اشاره گر به آن اشاره دارد :
cout << * ptr;