کار با بردارها در متلب
به نام خدا و سلام خدمت همهی دوستان و همراهان گام98. در این مقاله از سری آموزشهای نرمافزار متلب، به سراغ آموزش کار با بردارها در متلب رفتهایم. از آنجایی که بردارها در علوم پایه و مهندسی بسیار پرکاربرد بوده و از طرفی پایه و اساس نرمافزار متلب با بردار و ماتریس است، این مقاله ارائه شد. در این آموزش به معرفی انواع بردارها، روشهای ساخت بردار، فراخوانی، عملیات ریاضی روی بردارها و… میپردازیم. با ما همراه باشید.
قبل از شروع آموزش، چنانچه میخواهید متلب را بصورت پایهای فرابگیرید، به شما توصیه میکنیم از سایر مقالات و ویدئوهای آموزشیِ متلب وبسایت گام98 در صفحه « آموزش برنامهنویسی متلب » استفاده کنید.
انواع بردارها در متلب
دو نوع بردار در برنامه متلب میتوان ساخت: بردار افقی و بردار عمودی. ساخت این دو نوع بردار بسیار شبیه است و تفاوت بین این دو نوع بردار در عملیاتهای ماتریسی مشخص میشود.
روشهای ساخت بردار در متلب
برای درست کردن بردار در متلب ۳ روش کلی وجود دارد:
استفاده از براکت
برای درست کردن بردارها در متلب میتوانیم به صورت مستقیم عنصرهای بردار را در براکت بنویسیم. برای نمونه، بردار افقی را میتوان به دو صورت زیر با استفاده از براکتها تعریف کرد. هر دو بردار معادل یکدیگر هستند.
1 2 3 4 5 |
A = [10 23 51 17 3] ans = 10 23 51 17 3 % B = [10, 23, 51, 17, 3] ans = 10 23 51 17 3 |
برای بردار عمودی نیز میتوان به طریق مشابه عمل کرد:
1 2 3 4 5 6 7 8 |
C = [ 15 13 98 -10 ] D = [15; 13; 98; -10] |
همانطور که واضح است برای ایجاد بردارهای افقی میتوان ستونها را با جای خالی (space) یا با استفاده از , (comma) از هم جدا کرد همچنین برای ایجاد بردارهای عمودی میتوان سطرها را با رفتن به خط جدید و یا با استفاده از ; (semicolon) از هم جدا کرد. توجه کنید که اگر میخواهید در command window (پنجره فرمان) عبارات چند خطی بنویسید، باید از کلید ترکیبی Shift+Enter برای رفتن به خط بعدی استفاده کنید.
عملگر دو نقطه (colon) برای ایجاد بردار
این عملگر به دو روش استفاده میشود:
۱- با مشخص کردن گام
۲- بدون نوشتن گام.
برای روش اول قصد داریم برداری بسازیم که شامل دنباله حسابی با جمله اول a و گام d باشد به شرطی که تمام جملهها کمتر مساوی m باشند.
1 2 3 4 5 6 7 |
V = a : d : m; S = 10 : 3 : 20 ans = 10 13 16 19 S = 15: -2 : 7 ans = 15 13 11 9 7 |
در روش دوم فقط مقدار a و m را مینویسیم که این به معنای آنست که گام برابر یک است.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
V = a : m; S = 1 : 5 ans = 1 2 3 4 5 S = 57:58 ans = 57 58 S= 13:13 ans = 13 S= -2:3 ans = -2 -1 0 1 2 3 |
عملگر : بردار افقی تولید میکند، برای تولید بردار عمودی به این روش تنها لازم است خروجی ترانهاده شود. در ادامه عمل ترانهاده را توضیح میدهیم.
مقداردهی مستقیم بردار خالی
این روش جامعترین حالت برای ایجاد یک بردار است که در ابتدا یک متغیر تعریف میشود و سپس مقدار دهی میشود.
1 2 3 4 5 6 |
V = []; for i = 1 : 6 V(i) = i*2/10; end ans = 0.20 0.40 0.60 0.80 1.0 1.2 |
عملکرد متلب در پر کردن متغیرها، کاملاً به از پیش اختصاص دهی حافظه وابسته است. یعنی اگر قبل از پر کردن بردارها به اندازه طول بردار به متغیر، حافظه لازم اختصاص بدهیم، سرعت برنامه بسیار بالاتر خواهد بود. بنابراین میتوان برای دادههای از جنس عدد با استفاده از تابع zeros یک بردار افقی یا عمودی به طول n بسازیم که همه عنصرهایش برابر صفر است و سپس مقدار هر یک از عنصرها را تغییر دهیم:
1 2 3 4 5 6 |
V = zeros(6,1); for i = 1 : 6 V(i) = i*2/10; end ans = 0.20 0.40 0.60 0.80 1.0 1.2 |
همچنین میتوان برای اختصاص حافظه به دادههایی از جنس (ساختار، رشته، جدول، دسته، تاریخ و زمان و…) دیگر نیز به صورت زیر عمل کرد:
1 2 3 4 5 6 7 |
V(4).Square = []; V(4).Exponential = []; for i = 1 : 4 V(i).Square = i^2; V(i).Exponential = exp(i); end |
فراخوانی مقادیر در بردارها
برای فراخوانی مقدارها در یک بردار تنها باید مشخص شود که کدام مقدار یا مقدارها را میخواهیم، برای این کار به صورت کلی دو راه وجود دارد: استفاده از شاخصها (index) و یا استفاده از برداری شامل مقدارهای منطقی (logical).
استفاده از شاخصها
در متلب شاخصهای بردارها و ماتریسها از عدد 1 شروع میشوند و تا طول بردار ادامه پیدا میکند. بنابراین برای فراخوانی یک مقدار در بردار فقط لازم است شاخص عنصر بدانیم.
برای نمونه مقدار ۵ اُم بردار را فراخوانی کنیم:
1 2 3 4 5 |
V = linspace(-50,60,26) ans = -50.0 -45.6 -41.2 -36.8 -32.4 -28.0 -23.6 -19.2 -14.8 ... V(5) ans = -32.4 |
اگر هم زمان چند مقدار را با هم بخواهیم، میتوانیم شاخصها را در یک متغیر (Selected در اینجا) ذخیره کنیم و سپس فراخوانی کنیم یا شاخصها را وارد کرده و مقدارها را صدا بزنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
V = linspace(-20,35,6) ans = -20 -9 2 13 24 35 Selected = 1 : 3 % Or Selected = [1 2 3]; % Or Selected = [1; 2; 3]; ans = 1 2 3 V(Selected) % V(1:3) % V([1 2 3]) % V([1; 2; 3]) ans = -20 -9 2 |
در زبانهای برنامه نویسی، اگر طول یک آرایه (بردار) مشخص نبود، ابتدا طول آن را بدست میآوریم و سپس مقدار انتهایی آن را استخراج میکنیم. اما در متلب برای آخرین مقدار در بردارها و ماتریسها کلیدواژه end تعریف شدهاست که تنها در محدوده بین دو پرانتز پس از نام متغیر قابل استفادهاست:
1 2 3 4 5 6 7 8 |
V = logspace(1,2,10) ans = 10.0000 12.9155 16.6810 21.5443 27.8256 35.9381 46.4159 59.9484 77.4264 100.0000 V(7 : end) ans = 46.4159 59.9484 77.4264 100.0000 V(5 : end - 4) ans = 27.8256 35.9381 |
استفاده از بردار منطقی
در این روش یک بردار از جنس منطقی (logical) به طول برداری که میخواهیم دادههایش را فراخوانی کنیم میسازیم. در این بردار مقدارهایی که میخواهیم true و مقدارهایی که نمیخواهیم false هستند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
V = sinpi( -1 : 1/4 : 1) ans = 0 -0.7071 -1.0000 -0.7071 0 0.7071 1.0000 0.7071 0 Selected = [false, true, true, true, false, true, true, true, false] ans = 0 1 1 1 0 1 1 1 0 Selected = V ~= 0 ans = 0 1 1 1 0 1 1 1 0 Selected = ~~V ans = 0 1 1 1 0 1 1 1 0 V(Selected) ans = -0.7071 -1.0000 -0.7071 0.7071 1.0000 0.7071 |
متغیر Selected برداری از جنس logical است. در هر سه روشی که این متغیر را ساختیم، مقدارهای غیر صفر بردار V را بدست آوردیم. اول با استفاده از براکتها به صورت مستقیم مقدارهای مورد نظر را مشخص کردیم. دوم با استفاده از عملگر مقایسه، مقدارهای نامساوی 0 را بدست آوردیم. و آخر، با توجه به اینکه در تبدیل عدد به مقدار منطقی، مقدار غیرصفر معادل true و صفرها معادل false هستند؛ با دوبار استفاده از عملگر نفی (~) مقدارهای غیر صفر را بدست آوردیم.
امیدواریم تا اینجای آموزش برایتان مفید بوده باشد. بردارها جزو مهمترین بخشهای نرمافزار متلب است که در کدنویسی مسائل و پروژههای مختلف کاربرد دارد. برای مشاهده کاربرد آن و بطور کلی سایر پروژههای آمادهی نرمافزار متلب بر روی « خرید پروژه متلب » کلیک نمایید.
عملیاتهای روی بردارها در متلب
جمع و تفریق بردارها در متلب
عملیات جمع و تفریق بردارها در متلب کاملاً مشابه جمع و تفریق دو مقدار اسکالر است با این تفاوت که هر دو باید هم راستا و هم اندازه باشند. اگر بردارها هم نوع (افقی یا عمودی) و یا هم اندازه نباشند خروجی نتیجه عملیات یک ماتریس خواهد بود، و اگر فقط هم اندازه نباشند برنامه خطای ناسازگاری اندازه بردارها را نمایش میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
% example 1 A = [7 8 9 10]; B = -[15 14 13 12]; A + B ans = -8 -6 -4 -2 % example 2 B = B.' ans = -15 -14 -13 -12 A + B ans = [-8 -7 -6 -5; -7 -6 -5 -4; -6 -5 -4 -3; -5 -4 -3 -2] example 3 A = [1 5 9]; B = [-2 0 3 4]; A + B Arrays have incompatible sizes for this operation. Related documentation |
ضرب اسکالر، ضرب عنصری، ضرب نقطهای و ضرب خارجی بردارها در متلب
در متلب برای بردارها ۴ نوع ضرب در نظر گرفته شدهاست.
- عدد اسکالر در بردار: برای نمونه در این مثال زیر بردار V در عدد ۴ ضرب شدهاست.
1 2 3 4 |
V= [ 1 2 3 4 5]; M = 4*V M = 4 8 12 16 20 |
- ضرب عنصری (Element Wise): به این معنا که هر عنصر در بردار اول در عنصر متناظر خود در بردار دوم ضرب شده و حاصل یک بردار جدید خواهد بود. بدیهی است که طول هر دو بردار باید یکسان باشد و هر دو بردار باید یا افقی یا عمودی باشند. اگر اندازهها برابر نباشند با خطای ناسازگاری اندازه بردارها را مواجه میشویم و اگر نوع بردارها (افقی یا عمودی بودن) یکسان نباشد، خروجی یک ماتریس خواهد بود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
A = [1, 2, 3, 4, 5]; B = [5, 10, 15, 20, 25]; M = A.*B; ans = 5 20 45 80 125 A = [-2 4 7 1; B = [3; 5; 1; 9]; M = A.*B; ans = 4x4 A = [9; 1; 7; 10]; B = [6; 15; 2; 7; 3]; M = A.*B Arrays have incompatible sizes for this operation. Related documentation |
- ضرب نقطهای: در این ضرب، عنصرهای متناظر در یکدیگر ضرب شده و در نهایت حاصل ضرب عنصرها با یک دیگر جمع میشوند. برای این نوع ضرب یک تابع در متلب در نظر گرفته شدهاست. تابع dot دو بردار با طولهای مساوی به عنوان ورودی میگیرد و حاصل ضرب نقطهای را به عنوان خروجی تحویل میدهد. افقی یا عمودی بودن بردارها تغییری در جواب این تابع ایجاد نمیکند.
1 2 3 4 |
A = [4 -3 1]; B = [5, 10, 15, 20, 25]; C = dot(A,B) ans = 11 |
- ضرب خارجی: در این نوع ضرب مشابه ضرب نقطهای، یک تابع برای محاسبه حاصل ضرب خارجی وجود دارد. تابع cross دو ورودی با اندازه یکسان دریافت کرده و حاصل را به عنوان خروجی میدهد. اگر نوع هر دو بردار یا فقط یکی از آنها افقی باشد خروجی افقی خواهد بود. اما اگر هر دو بردار عمودی باشند خروجی نیز عمودی خواهد بود.
1 2 3 4 5 6 7 8 9 10 11 |
A = [3 0 1]; B = [-1 1 4]; C = cross(A, B) ans = -1 -13 3 C = cross(A.', B) ans = -1 -13 3 C = cross(A.', B.') ans = [-1; -13; 3] |
توان رسانی بردارها در متلب
توان رسانی بردارها در متلب به معنای به توان رسانی عناصر آن است. برای این عمل یک تابع و یک عملگر پیشبینی شدهاست که عملکرد هر دو یکسان و معادل یکدیگر هستند. تابع power که به صورت C=power(A,B) استفاده میشود دو ورودی دریافت میکند که ورودی اول آن بردار؛ و ورودی دوم توان است. عملگر متناظر این تابع ^. (dot + carret) است. کلید میانبر Shift + 6 برای کاراکتر ^ بر روی صفحه کلید موجود است. نحوه استفاده تابع و عملگر به صورت زیر است:
1 2 3 4 5 |
A = [-1; -2; -3].^2 ans = [1; 4; 9] B = power([2 5 3 11 12],2) ans = 4 25 9 121 144 |
ترانهاده بردارها در متلب
ترانهاده یک ماتریس جای سطرها و ستونها را با هم عوض میکند که به ترانهاده غیرمزدوج نیز شناخته میشود. برای بردارها این عمل بردار افقی را به بردار عمودی و بردار عمودی را به بردار افقی تبدیل میکند. برای انجام این عملیات در متلب یک تابع و یک عملگر (Operator) پیشبینی شدهاست که هم برای بردارها و هم برای ماتریسها عمل میکند. تابع و عملگر ترانهاده (transpose) معادل یکدیگر عمل میکنند و تفاوتی در عملکرد و نتیجه ندارند. تابع پیشبینی شده برای ترانهاده غیر مزدوج، تابع transpose است و عملگر آن .‘(dot + single quotation/نقطه + سینگل کوتیشن) است. کاراکتر سینگل کوتیشن بر روی کلید حرف “گ” قرار دارد.
1 2 3 4 5 6 7 |
A = [9 2 14]; transpose(A) ans = [9; 2; 4] B = [4; 12; 15]; B.' ans = 4 12 15 |
ترانهاده مزدوج، نوع دیگر ترانهاده است که مشابه ترانهاده غیرمزدوج برای آن یک عملگر و یک تابع در برنامه متلب پیشبینی شدهاست. ترانهاده مزدوج علاوه بر جابهجایی سطر و ستونها با یکدیگر، مزدوج مقدار مختلط عناصر را به جای آنها جایگذاری میکند. تابع ctranspose و عملگر ‘ (single quotation/ سینگل کوتیشن) برای محاسبه ترانهاده مزدوج در نظر گرفته شدهاند. برای دادههای عددی که مختلط نیستند خروجی عملگر و تابع (ctranspose) مشابه حالت ترانهاده غیرمزدوج است چرا که عدد مختلطی وجود ندارد که مزدوج آن جایگذاری شود. توجه شود که عملکرد این دو نوع ترانهاده در کار با تولباکسهایی نظیر تولباکس سیمبالیک متلب متفاوت است.
1 2 3 4 5 6 7 |
A = [3+1i; 2-2i; 1i]; ctranspose(A) ans = 3.0000-1.0000i 2.0000+2.0000i 0.0000-1.0000i B = [1i 2 .5-3i]; B' ans = [0-1i; 2+0i; 0.5+3i] |
الحاق بردارها در متلب
برای الحاق دو بردار به یکدیگر در برنامه متلب دو راه وجود دارد: استفاده از براکتها [ ] و استفاده از تابعهای پیشبینی شده در متلب. الحاق بردارها یعنی عناصر دو یا چند بردار به ترتیب دلخواه به صورت افقی یا عمودی قرار گیرند. برای نمونه سه بردار A و B و C را در نظر بگیرید، قصد داریم به چند روش مرسوم این سه بردار را به یکدیگر ملحق کنیم به صورتی که در ابتدا عناصر A سپس عناصر B و درنهایت عناصر C قرار گیرند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
A = [1, 2, 3]; B = [4; 5; 6]; C = [7, 8, 9]; D = cat(2, A,B.',C) ans = 1 2 3 4 5 6 7 8 9 D = horzcat(A,B.',C) ans = 1 2 3 4 5 6 7 8 9 D = [A, B.', C] ans = 1 2 3 4 5 6 7 8 9 D = [A.'; B; C.'].' ans = 1 2 3 4 5 6 7 8 9 D = cat(1, A.', B, C.') ans = [1; 2; 3; 4; 5; 6; 7; 8; 9] D = vertcat(A.', B, C.') ans = [1; 2; 3; 4; 5; 6; 7; 8; 9] D = [A.'; B; C.'] ans = [1; 2; 3; 4; 5; 6; 7; 8; 9] D = [A, B.', C].' ans = [1; 2; 3; 4; 5; 6; 7; 8; 9] |
در تابع cat ورودی اول بُعد را مشخص میکند که برای الحاق افقی مقدار 2 و برای الحاق عمودی مقدار آن 1 است. همچنین توجه شود که برای هر سه تابع cat، horzcat و vertcat ابتدا باید بردارها را به نوع مورد نظر (افقی یا عمودی) تبدیل کنیم؛ در غیر این صورت یا با خطا مواجه میشویم یا بردارها در یک ماتریس کنار هم چیده شده و به عنوان خروجی داده میشوند.
حذف مقدار از بردارها در متلب
حذف یک یا چند عنصر از بردار شامل دو مرحله است: ۱- انتخاب (فراخوانی) عنصر مورد نظر ۲- خالی کردن عنصرهای فراخوانی شده. در قسمت قبل نحوه فراخوانی مقدارها را توضیح دادیم، بنابراین مستقیماً به مرحله خالیکردن عنصرها، میرویم.
1 2 3 4 5 6 |
A = [58, 54, 89, 28, 36, 53, 7, 40,... 5, 48, 82, 12, 49, 96, 14, 1]; Selected = A < 50; A(Selected) = [] ans = 58 54 89 53 82 96 |
متغیر A را در نظر بگیرید، ابتدا برداری از جنس logical میسازیم، میتوان مستقیماً مقدار Selected را در متغیر A گذاشت و مقدار این عناصر را برابر [] که به معنای خالی است، قرار داد.
1 2 3 |
A = A(~Selected) ans = 58 54 89 53 82 96 |
راه دیگر اینست که متغیرA را برابر تمامی مقدارهای انتخاب نشده بگذاریم، بنابراین با عملگر ~ تمامی مقدارهای true در متغیر Selected به false و تمامی مقدارهای false به true تبدیل میکنیم.
1 2 3 |
Selected = [4 5 7 8 9 10 12 13 15 16]; A(Selected) = [] ans = 58 54 89 53 82 96 |
از شاخصهای عناصر هم میتوان برای فراخوانی استفاده کرد و مشابه قبل این مقدارها را خالی کرد.
محاسبه اندازه بردارها در متلب
چند روش برای محاسبه اندازه یک بردار در متلب وجود دارد که در ادامه به چند مورد از آنها اشاره میکنیم. اندازه یک بردار برابر است با “جذر مجموع مجذورهای عناصر آن”، پس طبق تعریف میتوان عمل کرد:
1 2 3 4 5 6 7 8 9 |
A = [11 9 8 3 10 18 2 1 12 16]; A2 = A.^2 ans = 121 81 64 9 100 324 4 144 256 S = sum(A2) ans = 1104 mag = sqrt(S) mag = 33.2265 |
ابتدا عناصر بردار A را بتوان 2 میرسانیم و حاصل را در متغیر A2 ذخیره میکنیم. سپس تمامی عناصر موجود در بردار A2 را با استفاده از تابع sum جمع میزنیم و در متغیر S ذخیره میکنیم. در انتها با استفاده از تابع sqrt جذر متغیر S را میگیریم، حاصل آن، اندازه بردار A خواهد بود. مراحل بالا را میتوان به صورت خلاصه نوشت:
1 2 |
mag = sqrt(sum(A.^2)) mag = 33.2265 |
روش دوم استفاده از ضرب ماتریسی است. در واقع تمامی مقدارها در برنامه متلب یک ماتریس هستند، مقدار اسکالر یک ماتریس 1×1 است، یک بردار هم یک ماتریس است که یک بُعد آن برابر 1 است. پس اگر یک بردار افقی به طول n داشته باشیم در واقع یک ماتریس به ابعاد n×1 داریم. حال اگر این ماتریس را در ترانهاده غیر مزدوج خودش ضرب کنیم، یعنی دو ماتریس به ابعاد n*1 و 1*n در هم ضرب شدهاند و حاصل آن برابر مجموع مجذور عناصر بردار مورد نظر است. پس داریم:
1 2 3 4 5 |
S = A*(A') S = 1104 mag = S^0.5 mag = 33.2265 |
متغیر S حاصل ضرب ماتریسی بردار افقی A در ترانهاده غیرمزدوج A است. با به توان یک دوم رساندن مقدار S، اندازه بردار بدست میآید. به صورت خلاصه میتوان نوشت:
1 2 |
mag = (A*(A'))^.5 mag = 33.2265 |
راه آخر و سادهترین روش استفاده از تابع normاست که نُرم بردار (اندازه بردار) را محاسبه میکند.
1 2 |
mag = norm(A) mag = 33.2265 |
در این مقاله سعی شد تا به تمامی جنبههای کار با بردارها در نرمافزار متلب اشاره کنیم. امیدواریم این آموزش برای شما مفید بوده باشد.
مطالب زیر را حتما مطالعه کنید
آموزش کامل انواع دستورات توزیعهای آماری در متلب
در این مقاله قصد داریم انواع دستورات مهم توزیع های آماری در متلب را به همراه رسم انواع توزیعها و برازش با استفاده از توزیع های آماری بیان نماییم.
آموزش صفر تا 100 تحلیل المان میله به روش اجزا محدود
در ادامه دومین سری از آموزشهای روش المان محدود در این مقاله تحلیل المان میله به روش اجزا محدود را همراه با مثال به طور صفر تا صدی آموزش خواهیم داد.
آموزش جامع و کامل تحلیل المان فنر به روش اجزا محدود
در اولین مجموعه از مقالات آموزشی روش اجزا محدود، آموزش جامع و کامل تحلیل المان فنر به روش المان محدود را همراه با مثال برای شما عزیزان بیان خواهیم کرد.
روش اجزا محدود – Finite Element Method
روش اجزا محدود یک روش عددی برای حل مسائل مهندسی و فیزیکی میباشد. در این مقاله به طورکلی با کاربرد، تاریخچه و مراحل حل این روش آشنا خواهیم شد.
آموزش جامع انواع دستورات توزیع نرمال در متلب
در این مقاله انواع دستورات توزیع نرمال در متلب را به شما آموزش میدهیم.همچنین نحوه کار با توزیع های نرمال تک متغیره و چند متغیره را با جزئیات خواهید آموخت.
آموزش صفر تا 100 کار با فایل اکسل در متلب بصورت کاربردی
در این مقاله به صورت کاملا کاربردی و آسان کار با فایل اکسل در متلب را به شما آموزش خواهیم داد که همه زیردستوارت و تنظیمات با توضیحات کامل شرح داده میشود.
دیدگاهتان را بنویسید