اندیس گذاری در متلب
بهنام خدا، سلام… هفتمین جلسه آموزش متلب رایگان را با موضوع مهم اندیس گذاری در متلب آغاز میکنیم. در جلسات گذشته، درباره ماتریس ها در متلب خیلی صحبت کردیم. امروز میخواهیم آدرسدهی در ماتریس ها یا بردارها در متلب را یاد بگیریم. لیست مباحث این جلسه ( اندیس گذاری در متلب و اسلایسینگ در متلب ) در ادامه آمده است. جلسه بسیار مهمی است. با هوسم همراه باشید…
مقدمهای بر اندیس گذاری در متلب
همه متغیرها در متلب آرایهای هستند، بنابراین برای کار با متلب باید بدانیم که چطور با آرایه ها کار کنیم. در حل مسائل مختلف با متلب، بسیار پیش میآید که به دو ویژگی زیر نیاز داشته باشیم:
- اینکه بخواهیم عنصر خاصی از یک آرایه را استخراج کنیم. به این کار indexing گفته میشود. به فارسی میگوییم اندیس گذاری یا اندیس دهی.
- یا اینکه بخش خاصی از یک آرایه را استخراج کنیم. به این کار slicing گفته میشود. slice به فارسی میشود تکه… اما ما مانند اندیس گذاری واژه مناسبی برای slicing سراغ نداریم. شما چه واژهای پیشنهاد میکنید. پیشنهادتان را در کامنت مطرح کنید تا درصورت خوب بودن از آن استفاده کنیم.
در این جلسه از آموزش متلب رایگان میخواهیم نحوه اندیس گذاری در متلب را بررسی کنیم.
آشنایی با اندیس گذاری در متلب و اسلایسینگ در متلب
تعریف ایندکسینگ و اسلایسینگ در متلب را با یک مثال شروع میکنیم. تصور کنید به یک شیرینی فروشی رفتهاید که شیرینیهایش مانند تصویر زیر در ویترین مغازه وجود دارد. حالا شما میخواهید به فروشنده بگویید که کدام شیرینی را میخواهید. این درحالی است که نام هیچکدام از شیرینیها را نمیدانید. فروشنده از شما میپرسد، کدام شیرینی را میخواهید. شما چه میگویید؟ مثلا میگویید آن شیرینی که در ردیف سوم و از سمت چپ دومین ستون هست، چشمم را گرفته…
خیلی زیاد پیش میآید که در کدنویسی بخواهیم به یک عنصر از آرایه اشاره کنیم. برای اشاره به یک عنصر از آرایه نیز از همین روش استفاده میکنیم! به این کار در متلب، ایندکسینگ یا اندیس گذاری گفته میشود. اینکه چطور این کار را انجام میدهیم، فعلا بماند…
شاید شما به شیرینی خیلی علاقه داشته باشید و بخواهید تعداد بیشتری شیرینی بخرید. این بار در پاسخ سوال فروشنده که کدام شیرینی را میخواهید چه میگویید؟ مثلا میگویید ردیف سوم هرچه هست میخواهم. یا اینکه تمام شیرینیهای ستون اول از راست را میخواهم. در کدنویسی هم پیش میآید که بخواهیم چند عنصر را با هم از یک آرایه استخراج کنیم. به این کار در متلب اسلایسینگ (یکی از دوستان معادل فارسی تکهبرداری را برای این واژه پیشنهاد دادند) گفته میشود.
بردارها و اندیس گذاری در متلب
همانطور که گفتیم اشاره به یک عنصر از آرایه، اندیس گذاری یا اندیس دهی گفته میشود. از بردار شروع میکنیم. برای اشاره به یک عنصر در بردار کافی است بدانیم که چندمین عنصر است. بیایید اول یک بردار سطری با مقادیر دلخواه تعریف کنیم. طول بردار را مثلا 9 در نظر میگیریم:
>> x = [2 2 11 16 19 3 12 10 1]
x = 2 2 11 16 19 3 12 10 1
vec = [6, 5, 3, 1];
خب ما یک بردار سطری به طول 9 به نام x داریم. حالا میخواهیم به عدد 19 اشاره کنیم. گفتیم کافی است بدانیم که عدد 19 چندمین عدد است. پنجمین عدد است، درست؟ برای اشاره به این عدد کافی است بنویسیم:
>> x(5)
ans = 19
پس برای اشاره به یک عنصر از بردار، شماره آن عنصر را پیدا میکنیم. بعد نام متغیر را مینویسیم و جلوی آن، شماره آن عنصر را داخل پرانتز وارد کرده و کلید Enter را میزنیم. به شماره عنصر در کدنویسی اندیس میگوییم.
>> vec(2)
ans =
5
برای بردارهای ستونی هم دقیقا همین کار را انجام میدهیم. بیایید بررسی کنیم. اول یک ماتریس تصادفی ستونی به طول 4 تعریف کنید:
>> y = [4; 2; 8; 4]
y = 4 2 8 4
برای اشاره به عدد 8 چکار باید کنیم؟ باید اندیس آن را پیدا کنیم. اندیسِ 8 چند است؟ 3 درست است؟ پس برای اشاره به 8 مینویسیم:
>> y(3)
ans = 8
>> c_vec = [7; 9; 1; 4; 3; 5]; >> c_vec(5)
ans =
3
ماتریس و اندیس گذاری در متلب
میدانیم که ماتریس یک بعد بیشتر نسبت به بردار دارد. بردار یک آرایه یک بعدی و ماتریس یک آرایه دو بعدی است. با این شرایط اندیس گذاری در ماتریس چگونه است؟ چطور به یک عنصر از ماتریس اشاره کنیم؟ اول بیایید یک ماتریس تعریف کنیم. یک ماتریس 3 در 4 تعریف میکنیم و آن را به متغیر z اختصاص میدهیم:
>> z = [8 4 12 4; 3 10 7 14; 10 11 2 3]
z = 8 4 12 4 3 10 7 14 10 11 2 3
خب اینجا چطور میتوانیم به یک عنصر اشاره کنیم؟ با همان روش قبلی این کار امکانپذیر است. یعنی باز هم شماره عنصر را وارد کنیم. اما چطور بفهمیم که از کدام طرف باید بشماریم؟ از چپ به راست بشماریم یا بالا به پایین؟ متلب به شکل زیر به عناصرِ یک ماتریس اندیس میدهد:
به شمارههای زرد در تصویر بالا دقت کنید. این شمارهها نحوه اندیس گذاری در ماتریس متلب را نشان میدهد. مثلا در ماتریس z که تعریف کردیم، عدد 7، چندمین عدد میشود؟ هشتمین عدد، درست است؟ خب حالا مینویسیم:
z = 8 4 12 4 3 10 7 14 10 11 2 3 >> z(8)
ans = 7
خب ما توانستیم عدد 7 را استخراج کنیم. ولی پیدا کردن اندیس آن کمی سخت بود نه؟ حالا اگر یک ماتریس بزرگتر داشتیم تکلیف چه بود؟ مثلا اگر یک ماتریس 20 در 20 داشتیم، پیدا کردن اندیس یک عدد کار سختی است. چقدر بنشینیم جمع و ضرب کنیم که اندیس عدد مدنظرمان چند میشود!
استفاده از سطر و ستون برای اندیس دهی در متلب
متلب فکر اینجا را هم کرده است. در متلب روش دیگری برای اندیسدهی به ماتریسها وجود دارد. در این روش بهجای استفاده از شماره عنصر، از شماره سطر و ستونی که آن عنصر قرار دارد استفاده میشود. این روش اندیس دهی برای ماتریسها رایجتر است. خب در این روش فقط کافی است که شماره سطر و ستون عنصر را پیدا کنیم. به تصویر زیر دقت کنید. تعداد سطرها و ستونهای یک ماتریس در متلب به صورت زیر شمرده میشود:
مثلا در ماتریس بالا، a11 اندیسش (1و1) است. یعنی، سطر اول و ستون اول. این نقطه، نقطه مبدا در ماتریس محسوب میشود. یک مثال دیگر، a32 در سطر سوم و ستون دوم است. یعنی (2و3). حال برویم سراغ ماتریس z… برای عدد 7 در ماتریس z این کار را انجام دهید. همانطور که مشاهده میکنید این عدد 7 در دومین سطر و سومین ستون از ماتریس z قرار دارد. حالا چطور از این اعداد استفاده کنیم؟ برای اندیس دهی با سطر و ستون کافی است بنویسیم:
>> z(2, 3)
ans = 7
پس اول شماره سطر را وارد کردیم و بعد شماره ستون. دقیقا همان کاری که ما در انتخاب شیرینیها انجام دادیم! خب ما تا اینجا با اندیسدهی بردارها و ماتریسها آشنا شدیم. در بخش بعدی با یک کلیدواژه مهم در اندیس گذاری در متلب آشنا میشویم.
>> my_mat = [7 6 2 5; 1 10 10 9; 3 10 10 2]
my_mat =
7 6 2 5
1 10 10 9
3 10 10 2
>> my_mat(end) %------------- or -------------- >> my_mat(3, 4) %------------- or -------------- >> my_mat(12)
با هرکدام از سه دستور بالا میتوانید به هدفتان برسید! با end در بخش بعدی آشنا خواهید شد.
توجه قبلا هم گفته بودیم، اول سطر بعد ستون… برای اندیس در متلب اول سطر و بعد ستون را وارد کنید.
توجه دو روش برای اندیس گذاری در ماتریس گفته شد. یک روش شبیه به بردار و دیگری روش سطری-ستونی… هردو کاربرد دارند و هر دو را بیاموزید. اما در اندیس گذاری ماتریس اکثرا از روش سطری-ستونی استفاده میشود.
استفاده از end برای اندیس گذاری در متلب
دیدیم که برای شمردن سطرها و ستون ها در متلب بهترتیب از بالا به پایین و چپ به راست حرکت میکنیم. اما ببینید متلب برای اشاره به آخرین سطر یا ستون چه ویژگیای به شما داده… برای اشاره به آخرین عنصر از هر سطر یا ستون میتوان از کلیدواژه end استفاده کرد. مثلا اگر بخواهیم به آخرین سطر و دومین ستون از متغیر z اشاره کنیم. در این صورت کافی است بنویسیم:
>> z(end, 2)
ans = 11
>> z(3, 2)
ans =
11
چه از end استفاده کنیم و چه دقیقا از عدد برای اشاره به سطر آخر استفاده کنیم، نتیجه یکی است. اما با end کمی کارمان برای اشاره به سطر و ستون های آخر سادهتر میشود. از کلیدواژه end میتوانید برای اشاره به عناصر، قبل از آخر نیز استفاده کنید! یعنی، برای مثال از end میتوانید برای اشاره به ستون یکی مانده به آخر استفاده کنید. برای این کار کافی است بنویسید end-1. به همین ترتیب میتوانید عناصر قبلتر را هم استخراج کنید. مثلا اگر بخواهیم عنصری که در سطر یکی مانده به آخر و ستون دوتامانده به آخر از z وجود دارد را استخراج کنیم. در این صورت مینویسیم:
>> z(end-1,end-2)
ans = 10
>> my_mat(2, end)
اسلایسینگ در متلب ( slicing در متلب )
اسلایسینگ در متلب به معنای انتخاب یک بخش از یک ماتریس یا بردار است. مثلا اگر در یک بردار عناصر 2 تا 6 را یکجا استخراج کنیم، به این کار اسلایسینگ گفته میشود. در عمل اسلایسینگ در متلب، عملگر كولن ( : ) نقش مهمی ایفا میکند. در ادامه این عملگر را معرفی کرده و نحوه انجام اسلایسینگ را با هم بررسی میکنیم.
عملگر كولن ( : ) نماد فاصله است. درواقع این عملگر نماینده کلمه «تا» است. ما گفتیم در یک بردار عناصر 2 تا 6 را میخواهیم. این به زبان متلب میشود عبارت 2:6 . برویم سراغ کدنویسی و بیشتر یاد بگیریم. بیایید با استفاده از عملگر کولن عناصر 2 تا 6 از بردار x را استخراج کنیم:
>> x
x =
2 2 11 16 19 3 12 10 1
>> x(2:6)
ans = 2 11 16 19 3
چک کنید ببینید درست هست یا نه. این کار را برای اندیس گذاری ماتریس هم میتوانیم انجام دهیم. مثلا فرض کنید بخواهیم عناصر سطر اول و ستون 2 تا 4 را استخراج کنیم. در این صورت باید بنویسیم:
>> z(1, 2:4)
ans = 4 12 4
بیایید عملگر کولن را با کلیدواژه end ترکیب کنیم. مثلا فرض کنید بخواهیم عناصر 4 تا آخر بردار x را استخراج کنیم. در این صورت باید بنویسیم:
>> x(4:end)
ans = 16 19 3 12 10 1
تمرین اندیس گذاری در متلب و اسلایسینگ در متلب یک بازی و ریاضی است. باید خیلی تمرین کنید تا بر آنها مسلط شوید. پس لطفا یادتان نرود تمرین کنید…
>> my_mat(3, 2:end) >> my_mat(3, 2:4)
تغییر مقادیر آرایه با اندیس در متلب
عناصر یک آرایه را می توان با ترکیب indexing و تخصیصِ مقدار، تغییر داد. به این صورت که ابتدا با استفاده از اندیسدهی عنصر یا عناصر موردنظرمان را استخراج میکنیم. سپس این عناصر را مساوی با مقادیر جدید قرار میدهیم. مثلا فرض کنید بخواهیم مقدار عدد 19 را در بردار x، با عدد 44 جایگزین کنیم. دراینصورت کافی است بنویسیم:
>> x(5) = 44
x = 2 2 11 16 44 3 12 10 1
مشاهده میکنید که عدد 44 جایگزین 19 در اندیس 5 شده است. به همین ترتیب برای ماتریس ها هم میتوان با اندیس دهی مقادیر را تغییر داد. همچنین میتوان مقادیر چندین عنصر را با هم تغییر داد. به عنوان مثال فرض کنید بخواهیم عناصر موجود در سطر اول و ستون 2 تا 4 از z را با مقادیر 1، 1 و 1 جایگزین کنیم. در این صورت باید بنویسیم:
>> z(1, 2:4) = [1, 1, 1]
z = 8 1 1 1 3 10 7 14 10 11 2 3
ما عناصر موردنظرمان را استخراج کردیم و سپس آن را با مقادیر جدید جایگزین کردیم. دقت کنید که این مقادیر را بهتر است که به یک بردار تبدیل کنیم. یعنی مقادیر 1، 1 و 1 را بهتر است به بردار [1, 1, 1] تبدیل کنیم که همین کار را هم کردیم.
انتخاب تمامی عناصر سطر و ستون با عملگر کولن
یک نکته مهم دیگر در مورد عملگر کولن وجود دارد.عملگر کولن برای انتخاب تمامی عناصر یک سطر یا ستون نیز مورد استفاده قرار میگیرد. مثلا اگر بخواهیم تمامی عناصر موجود در سطر سوم از متغیر z را انتخاب کنیم، کافی است بنویسیم:
>> z(3, 🙂
ans = 10 11 2 3
ترفند اگر به یک ماتریس، اندیس : را فقط بدهیم یک اتفاق جالب خواهید افتاد. برای z این کار را انجام میدهیم:
>> z(:)
ans = 4 8 3 10 10 4 11 12 2 7 14 3
مشاهده میکنید با انجام این کار، ماتریس z به یک بردار ستونی تبدیل میشود! گاهی اوقات نیاز میشود که یک ماتریس را به بردار تبدیل کنیم. یکی از راهها همین است که فقط از علامت کولن در اندیس استفاده کنیم.
>> my_mat(2, 2) = 0.14
my_mat =
7.0000 6.0000 2.0000 5.0000
1.0000 0.1400 10.0000 9.0000
3.0000 10.0000 10.0000 2.0000
چرا نمایش اعداد داخل ماتریس عوض شد؟ پاسختان را کامنت کنید.
دریافت PDF جلسه اندیس گذاری در متلب
برای دریافت pdf این جلسه، لطفا ایمیل خود را در باکس زیر وارد کرده و روی دکمه «دریافت pdf» کلیک کنید.
منابع آموزش متلب
در فهرست زیر، تعدادی از منابع خوب آموزش متلب را معرفی کردهایم. ضرورتی وجود ندارد که اینها را نگاه کنید. چون ما برای آموزش متلب، این منابع را مطالعه و استفاده کردهایم.
بسیار خب، این جلسه هم به پایان رسید. با دو مفهوم اندیس در متلب و اسلایسینگ در متلب آشنا شدید. این جلسه شامل مباحث شیرینی بود که پیشنهاد میکنیم به آن مسلط شود. کسانی که به کاربردهای عملگر کولن در متلب مسلط میشوند، میتواند برنامههایی بنویسند که سریع اجرا میشود! بعدا به شما نشان میدهیم که این عملگر : چقدر در سرعت و زمان اجرا بهینه هست. این جلسه چطور بود؟ مشتاق دیدن نظرات شما هستیم. با هوسم همراه باشید…
مطالب زیر را حتما مطالعه کنید
تعریف متغیر در متلب
آموزش متلب رایگان
دستور max در متلب
دستور محاسبه انتگرال در متلب
دستور input در متلب
دستور ezplot در متلب
19 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
با سلام و عرض ادب
می خواهم برنامه ای در مطلب بنویسم x=a^3+b^2+c به ازای a=1,b=2,c=3وa=2,b=5,c=7و a=3,b=8,c=11 که مقدار x را محاسبه نماید .به شرطی که x=a^3+b^2+c یک بار نوشته شود و تکرار نشود .به عبارتی به ازای مثلا ده تا متغیرa, b,c رابطهx=a^3+b^2+c فقط یک بار نوشته شود . با سپاس
سلام .
ممنون از توضیحات خوبتون
سلام
من نیاز دارم برای تحلیل غیرخطی سازه از دو اندیس برای یک متغیر استفاده کنم.
مثلا دو حلقه پشت سر هم داریم:
for i=3
for j=1
u(j+1)(i+1)=u(j)(i+1)+daeltau(j)
که حلقه اول، در یک ماتریس و حلقه دوم، در ماتریسی دیگر ذخیره گردد
در کتاب، اندیس j در بالای u نوشته شده و اندیس i در پایین u نوشته شده است
سلام میخواستم اگر میشه راهنمای بفرمایید چطور میتونم یک ماتریس بنویسم بادرایه های بی نهایت درسطروستون فقط روی قطراصلی یکی قبل ویکیم بعدمقداردارد بقیه درایه ها صفراست ( معادله شوردینگررامیخواهیم ازراه ماتریس حل کنیم)
باسلام
علت تغییر نوع نمایش در ماتریس در تمرین آخر عدد 0.14 هست که با درایه 2 و 2 جایگزین شده
با تشکر از آموزش های شما
اقا جلسات یکم باگ داره
مثلا جلسات قبل بعضی خروجی ها اشتباه بودن
این جلسه هم کد اینطوری بود:
z(3,:)
اومده پرانتز و کالن رو تبدیل به ایموجی کرده مثل یاهومسنجر
سلام
اموجیها رو به ما نشون نمیده. ممکن هست از تنظیمات مرورگرتون باشه.
سلام ماتریس های تصادفی درس جلسه ده هستش و اینکه این درس باید طبیعتا بعد از اون باشه ممنون از سایت خوبتون
سلام
آموزش متلب هوسم بعد از کلی تحقیق، همفکری و تغییرات به این شکل رسیده. برهمین اساس، معتقدیم جای درسنامه اندیس گذاری در متلب خوب هست. 😊🙏
تو خود جلسه دهم گفتید که این جلسه ششم هست .
سلام و سپاس عالی بود.
توی متن علامت نگارشی : کنار پرانتز تبدیل به شکلک 🙂 شده. ممکنه این اتفاق در آموزش های بعدی یا توی پست های دیگه تون هم رخ داده باشه، برای خلاصی از این موضوع توی منوهای وردپرس بخش تنظیمات> نوشتن برید و اونجا تیک اولی مربوط به همین تبدیل علائم به اموجی هست رو بردارید.
راه دوم این هست که همیشه بین علائم این چنینی فاصله بذارید که کار سختیه 🙂
سلام، سپاس 🌹
ممنون از پیشنهادتون، اصلاح شد 🙏😊
سلام خسته نباشید چرا طبق مثال شما انجام میدم ارور میده یا جواب مثال های من با شما فرق میکنه علتش چیه؟
سلام، سپاس
در مورد ارورها نیاز هست بیشتر توضیح بدید، اینکه خطا چی هست و کجا خطا میده.
اما اینکه مثالهای شما با متن فرق داره طبیعی هست. چون متغیرها به صورت تصادفی تولید شدن و طبیعی هست که متفاوت باشن.
اسلایسینگ : تکه برداری
سلام
چه پیشنهاد خوبی 👌🙏
سپاس 🌹
بُرش هم بد نیست. درواقع معنی فارسی اسلایس به بُرش نزدیکه. شکل همین اسلایس توی فتوشاپ شکل یک چاقو هست که میخواید مثلا کیک رو برش بدید.
اینجا مثلا میشه یک بُرش از ماتریس
سلام،
پیشنهاد خوبیه، ممنون 🌹🙏
سلام وقت بخیر
ممنون از آموزش خیلی خوبتون
جواب :بخاطر اینکه ما عدد اعشاری رو جایگزین درایه ماتریس کردیم
بقیه اعداد هم اعشاری شدن
که درواقع اگر صفر ها رو برداریم
همون عدد قبلی میشه