در آموزشهای پیشین مجله تم آف، با روشهای تولید اعداد تصادفی در پایتون و اکسل آشنا شدیم. از دستور randn در متلب برای تولید اعداد تصادفی با توزیع نرمال استفاده میشود. در واقع، خروجی این تابع مقادیر عددی تصادفی است. در این آموزش از مجله تم آف، با دستور randn در متلب آشنا میشویم و مثالهایی از کاربرد آن را بررسی خواهیم کرد.
دستور randn در متلب
اگر آرگومانی نداشته باشیم و دستور randn را بهتنهایی بنویسیم، فقط یک مقدار تصادفی خواهیم داشت. برای مثال، اگر دستور زیر را در متلب بنویسیم:
randn
جواب، عددی مانند عدد زیر خواهد بود:
ans = 0.5377
دقت کنید که با هر بار اجرای این دستور، عدد تصادفی جدیدی را بهعنوان نتیجه خواهیم دید.
علاوه بر خود دستور randn بهتنهایی، در تابع randn میتوانیم یک یا چند مقدار را بهعنوان آرگومان وارد کنیم. ورودیها و آرگومانهای تابع randn در متلب میتواند بهگونهای باشد که براساس نیاز کاربر تعریف شود. همچنین میتوانیم به اندازه و بُعد ورودیای که میخواهیم به تابع بدهیم اشاره کنیم. این ورودی میتواند تکبعدی یا چندبعدی باشد. در کنار اندازه، میتوان نوع توزیع مورد نظر را نیز تعیین کرد. در ادامه، این آرگومانها را معرفی میکنیم.
تولید اعداد تصادفی با دستور randn در متلب
تابع randn در متلب را میتوان به شیوههای زیر نوشت و استفاده کرد:
X = randn
X = randn(n)
X = randn(sz1,...,szN)
X = randn(sz)
X = randn(___,typename)
X = randn(___,'like',p)
X = randn(s,___)
در ادامه، کاربرد هریک را معرفی میکنیم.
- X = randn یک مقدار اسکالر تصادفی را از توزیع نرمال استاندارد برمیگرداند.
- X = randn(n) یک ماتریس n در n را با درایههایی از اعداد تصادفی توزیع نرمال برمیگرداند.
- X = randn(sz1,…,szN) یک آرایه sz1 در … در … در szN از اعداد تصادفی را برمیگرداند که sz1 و … و szN، هریک، اندازه هر بعد آرایه را نشان میدهند. برای مثال، randn(3,4) یک ماتریس ۳ در ۴ را برمیگرداند.
- X = randn(___,typename) یک آرایه از اعداد تصادفی را از نوع داده typename برمیگرداند. ورودی typename میتواند ‘single’ یا ‘double’ باشد. دقت کنید که میتوان از هریک از آرگومانها ورودی در سینتکسهای قبل استفاده کرد.
- X = randn(___,’like’,p) یک آرایه از اعداد تصادفی مانند p را برمیگرداند؛ یعنی از همان نوع شیء p. میتوان تعیین کرد که نوع داده typename یا ‘like’ باشد، اما هردو را با هم نمیتوان نوشت.
- X = randn(s,___) اعداد تصادفیای را از جریان اعداد s تولید میکند، بهجای آنکه از جریان جهانی آنها را تولید کند. برای تولید یک جریان، میتوان از دستور RandStream استفاده کرد. s را میتوان با هریک از ترکیبهای آرگومان در دستورات قبلی در نظر گرفت، جز آنهایی که شامل “like” هستند. این سینتکس از ورودی “like” پشتیبانی نمیکند.
توجه: ورودیهای «seed» ،«state» و «twister» برای دستور randn توصیه نمیشوند. به جای آن از تابع rng استفاده کنید.
تفاوت دستور randn و rand چیست؟
دستور ()rand یک ماتریس با درایههای تصادفی تولید میکند که بهطور یکنواخت در بازه (۰,۱) توزیع شده است، برمیگرداند. آرگومانها همانند آرگومانهای تابع ()eye در متلب هستند. تابع ()randn ماتریسی با عناصر شبهتصادفی توزیع نرمال با میانگین صفر و واریانس یک برمیگرداند. آرگومانهای این تابع مانند آرگومانهای rand مدیریت میشوند.
مثالهای دستور randn در متلب
در این بخش، مثالهای متنوعی را از کاربرد تابع randn در متلب بیان میکنیم.
مثال اول دستور randn
ماتریسی ۵ در ۵ از اعداد تصادفی با توزیع نرمال تولید کنید.
جواب: از دستور زیر استفاده میکنیم:
r = randn(5)
و ماتریس زیر ایجاد میشود:
r = 1.3546 -1.9609 1.3790 -0.2779 -1.5771 -1.0722 -0.1977 -1.0582 0.7015 0.5080 0.9610 -1.2078 -0.4686 -2.0518 0.2820 0.1240 2.9080 -0.2725 -0.3538 0.0335 1.4367 0.8252 1.0984 -0.8236 -1.3337
مثال دوم دستور randn
مقادیری از یک توزیع نرمال دو متغیره با بردار میانگین و ماتریس کوواریانس مشخص شده تولید کنید.
جواب: کد زیر را مینویسیم:
mu = [1 2];
sigma = [1 0.5; 0.5 2];
R = chol(sigma);
z = repmat(mu,10,1) + randn(10,2)*R
و جواب آن بهصورت زیر خواهد بود:
z = 2.1275 1.8579 1.3502 -0.4741 0.7009 3.1260 1.0229 2.6994 0.7380 1.8425 -0.7502 1.0789 0.7143 0.8013 0.1686 2.9319 0.0208 1.3342 -0.1564 0.4766
مثال سوم تابع randn
یک عدد مختلط تصادفی منفرد با بخشهای حقیقی و موهومی توزیع نرمال ایجاد کنید.
جواب: از دستور ساده زیر استفاده میکنیم:
a = randn + 1i*randn
و به جواب زیر میرسیم.
a = 1.3514 - 0.2248i
مثال چهارم تابع randn
یک آرایه ۳ در ۲ در ۳ از اعداد تصادفی بسازید.
جواب: بدین منظور، کد زیر را مینویسیم:
X = randn([3,2,3])
که جواب آن بهصورت زیر است:
X(:,:,1) = 1.6555 -0.8655 0.3075 -0.1765 -1.2571 0.7914 X(:,:,2) = -1.3320 0.3335 -2.3299 0.3914 -1.4491 0.4517 X(:,:,3) = -0.1303 0.8620 0.1837 -1.3617 -0.4762 0.4550
مثال پنجم تابع randn
یک بردار ۱ در ۴ از اعداد تصادفی بسازید که درایههای آن single باشند.
جواب: از دستور زیر استفاده میکنیم:
r = randn(1,4,'single')
که جواب آن بهصورت زیر است:
r = 1×4 single row vector -0.8487 -0.3349 0.5528 1.0391
اگر دستور زیر را بنویسیم:
class(r)
جواب زیر را خواهیم داشت:
ans = 'single'
مثال ششم تابع randn
ماتریسی از اعداد تصادفی توزیع نرمال با اندازه یک آرایه موجود ایجاد کنید.
جواب: کد زیر را مینویسیم:
A = [3 2; -2 1];
sz = size(A);
X = randn(sz)
که نتیجه حاصل از اجرای آن بهصورت زیر است:
X = -1.1176 0.6601 1.2607 -0.0679
ترکیب دو خط قبلی کد در یک خط یک الگوی رایج است و میتوان آن را بهصورت زیر نوشت:
X = randn(size(A));
مثال هفتم تابع randn
یک ماتریس ۲ در ۲ با دقت single از اعداد تصادفی ایجاد کنید.
جواب: از دستور زیر استفاده میکنیم:
p = single([3 2; -2 1]);
آرایهای از اعداد تصادفی با اندازه و نوع داده p ایجاد میکنیم.
X = randn(size(p),'like',p)
که نتیجه اجرای آن بهصورت زیر است:
X = 2×2 single matrix -0.1952 -0.3031 -0.2176 0.0230
اگر بخواهیم کلاس این جواب را مشخص کنیم، از دستور زیر استفاده میکنیم:
class(X)
که نتیجه زیر را نشان میدهد:
ans = 'single'
مثال هشتم تابع randn
یک مثال ساده را بررسی میکنیم. در این مثال، Value1 یک متغیر ورودی است که مقادیر تصادفی را ذخیره میکند. در این کد، تابع randn هیچ آرگومانی ندارد تا فقط یک مقدار نشانداده شده در مثال را چاپ کند.
clc ;
clear all ;
disp('Output');
Value1 = randn
نتیجه این کد بهصورت زیر است:
Output Value1 = 1.8339
اگر تابع randn را بهطور مکرر در یک کد بنویسیم، مقادیر تصادفی متفاوتی را چاپ میکند. مثلاً، اگر یک تابع را سه بار بنویسیم، سه مقدار تصادفی را بهعنوان خروجی داریم. برای نمونه، کد زیر را نیز مینویسیم:
clc ;
clear all ;
disp ('Output');
Value1 = randn
Value2 = randn
Value3 = randn
با اجرای این کد، خروجی زیر را خواهیم داشت:
Output Value1 = 1.0347 Value2 = 0.7269 Value3 = -0.3034
مثال نهم تابع randn
در این مثال، ابعاد را بهعنوان آرگومان در تابع randn خواهیم دید. برای مثال، میتوانیم ببینیم که یک مقدار خروجی برای یک تابع داریم. اگر فقط یک مقدار در داخل پرانتزها وجود داشته باشد، آنگاه تعدادی از سطرها و همچنین تعدادی از ستونهای ماتریس خروجی را نشان میدهد. بنابراین، ابعاد خروجی دو در دو و چهار در چهار است. بهعنوان مثال، دو مقدار در داخل پرانتزها نوشته شده است. مقدار اول تعداد سطر و مقدار دوم تعداد ستون را نشان میدهد.
clc ;
clear all ;
disp('Output');
Value1 = randn(2)
Value2 = randn(4)
خروجی کد بالا بهصورت زیر است:
Output Value1 = 0.2939 0.8884 -0.7873 -1.1471 Value2 = -1.0689 0.3252 -0.1022 -0.8649 -0.8095 -0.7549 -0.2414 -0.0301 -2.9443 1.3703 0.3192 -0.1649 1.4384 -1.7115 0.3129 0.6277
اکنون کد زیر را آزمایش میکنیم.
clc ;
clear all ;
disp('Output');
Value1 = randn (1,3)
Value2 = randn (4,2)
که نتیجه اجرای آن بهصورت زیر است:
Output Value1 = 1.0933 1.1093 -0.8637 Value2 = 0.0774 1.5326 -1.2141 -0.7697 -1.1135 0.3714 -0.0068 -0.2256
همچنین، وقتی سه مقدار در داخل پرانتزهای تابع وجود داشته باشد، مقدار اول تعداد سطر، مقدار دوم تعداد ستون و مقدار سوم تعداد ماتریسها را مشخص میکند. بدین منظور، کد زیر را مینویسیم.
clc ;
clear all ;
disp ('Output');
Value1 = randn (1, 3, 2)
Value2 = randn(3, 1, 2)
و نتیجه اجرای آن بهصورت زیر خواهد بود:
Output Value1(:,:,1) = 1.1174 -1.0891 0.0326 Value1(:,:,2) = 0.5525 1.1006 1.5442 Value2(:,:,1) = 0.0859 -1.4916 -0.7423 Value2(:,:,2) = -1.0616 2.3505 -0.6156
مثال دهم تابع randn
در این مثال، نوع دادهای را که میخواهیم ایجاد کنیم، بررسی میکنیم. در کنار ابعاد، میتوانیم نوع ورودی مورد نظرمان را در خروجی مانند single یا double یا distributed نیز ذکر کنیم که در این مثال آن را بررسی میکنیم. اگر عملیات ماتریسی انجام دهیم، همه ماتریسها باید یک اندازه باشند. بنابراین، برای حفظ اندازه یک ماتریس، می توانیم از سینتکس یا همان نحو “size” در تابع randn استفاده کنیم که در مثال نشان داده شده است.
clc ;
clear all ;
disp('Output');
Value1 = randn(2, 'single')
Value2 = randn (3, 'distributed')
با اجرای این کد، به نتیجه زیر میرسیم.
Output Value1 = 2×2 single matrix -0.1961 0.2916 1.4193 0.1978 Value2 = 1.7548 -2.3358 -0.1436 -0.8130 -0.1428 -0.2606 -2.0423 0.3107 0.8402
بهعنوان یک مثال دیگر، کد زیر را مینویسیم:
clc ;
clear all ;
disp('Output');
Value1 = randn( 2,'single')
Value2 = randn (2 ,'double')
که جواب آن بهشکل زیر است.
Output Value1 = 2×2 single matrix 1.5877 0.6966 -0.8045 0.8351 Value2 = -0.2437 -1.1658 0.2157 -1.1480
اکنون، یک کد دیگر را بررسی میکنیم.
clc ;
clear all ;
disp('Output');
Input = [ 4,3; 2,2; 4,7]
Dim = size (Input)
Value1= randn (Dim)
و در نهایت، خروجی زیر را خواهیم داشت:
Output Input = 4 3 2 2 4 7 Dim = 3 2 Value1 = 0.1049 -0.6669 0.7223 0.1873 2.5855 -0.0825
مثال یازدهم تابع randn
در مثال قبلی، دادههای ورودی اعداد حقیقی بودند. با استفاده از تابع randn در متلب میتوان اعداد مخلتلط تصادفی نیز تولید کرد. در این مثال، برای ایجاد یک عدد مختلط، عدد حقیقی را در ‘i’ ضرب میکنیم. کد زیر نحوه تولید اعداد مختلط تصادفی با استفاده از تابع randn در متلب را نشان میدهد.
clc ;
clear all ;
disp('Output');
Value1 = 2+ i * randn
Value2 = randn + i * randn
که جواب آن بهصورت زیر است:
Output Value1 = 2.0000 - 1.9330i Value2 = -0.4390 - 1.7947i
جمعبندی
در این آموزش از مجله تم آف، با تابع randn در متلب آشنا شدیم و مثالهایی عملی از کاربرد آن در تولید اعداد تصادفی را بیان کردیم.