نرم افزار متلب عملکردهای زیادی را در اختیار ما قرار میدهد که در مسائل محاسباتی مختلف، برای ما مفید هستند.
متلب، سنگ بنای دنیای محاسبات عددی، قابلیتهای اندیس گذاری منحصر به فردی را ارائه میدهد که میتواند کد شما را بهینه کند و عملکرد آن را افزایش دهد.
اندیس گذاری راهی برای انتخاب یک عنصر خاص در یک آرایه است و این انتخاب براساس شاخص یا موقعیت آن عنصر انجام میشود.
اندیس گذاری زمانی مفید است که ما نیاز به دسترسی یا ویرایش یا حذف برخی از سلولها داریم و میخواهیم قبل از اعمال هر تغییری از مقدار موجود در آن سلول باخبر شویم.
هنگامی که از یک زیرنویس برای اشاره به یک عنصر در یک آرایه استفاده میکنیم، به آن اندیسگذاری خطی گفته میشود.
در این مقاله به بررسی یک قابلیت قدرتمند متلب به نام اندیس گذاری میپردازیم.
درک این قابلیت میتواند رویکرد شما را برای حل مسائل محاسباتی تغییر دهد.
بیایید تفاوتهای ظریف اندیس گذاری در متلب را بررسی کنیم تا مهارتهای کدنویسی شما را افزایش دهیم.
1# اندیس گذاری چیست؟
متلب که به دلیل رویکرد مبتنی بر ماتریس شناخته شده است، به کاربران اجازه میدهد تا به آسانی به عناصر خاصی از آرایهها و ماتریس ها دسترسی داشته باشند و آنها را تغییر دهند که به این اجازه دسترسی، اندیس گذاری در متلب گفته میشود.
با درک اصول اندیس گذاری در متلب، میتوانید ساختارهای داده را بهطور موثر دستکاری کنید.
2# انواع اندیس گذاری در متلب
چندین روش برای اندیس گذاری در متلب، جهت دسترسی به عناصر ماتریسها و آرایهها تعریف شده است که متداولترین آنها بهصورت زیر هستند:
- اندیس گذاری با موقعیت عناصر (زیرنویس): جایی که موقعیت عناصر مورد نظر خود را در هر بُعد از ماتریس یا آرایه بهطور جداگانه مشخص میکنید.
رایجترین راه این است که بهصراحت شاخصهای عناصر را مشخص کنید. - اندیس گذاری با یک شاخص واحد (خطی): در این نوع، ماتریس بدون توجه به ابعاد آن، بهعنوان یک بردار در نظر گرفته میشود.
به این معنی که شما هر موقعیت را در ماتریس یا آرایه با یک شاخص مشخص میکنید. - اندیس گذاری با مقادیر منطقی: در این روش از یک ماتریس منطقی (ماتریس مقادیر true و false) با ابعاد یکسان ماتریسی که میخواهید به عنوان یک ماسک اندیس گذاری کنید، استفاده مینمایید تا مشخص کنید کدام مقدار را باید برگردانید.
هر کدام از این روشها دارای مزایای منحصر به فرد و موارد استفاده خاص هستند که آنها را به ابزارهایی ضروری در جعبه ابزار برنامه نویس متلب تبدیل میکند.
1-2# توضیح برای انواع اندیس گذاری
اکنون این سه روش با استفاده از ماتریس 3 در 3 بهعنوان مثال M، با جزئیات بیشتر توضیح داده شدهاند:
M = magic(3) <<
= ans
6 1 8
7 5 3
2 9 4
1) اندیس گذاری با موقعیت عناصر
سادهترین روش برای دسترسی به یک عنصر، مشخصکردن اندیس سطر-ستون آن است.
بهعنوان مثال، برای دسترسی به عنصر در ردیف دوم و ستون سوم از کد زیر استفاده میشود:
M(2, 3) <<
ans = 7
تعداد زیرنویسهای ارائهشده دقیقاً با تعداد ابعاد M موجود مطابقت دارد.
توجه داشته باشید که ترتیب زیرنویسها مانند قرارداد ریاضی است و شاخص ردیف اول نمایانگر ردیف است.
علاوه بر این، شاخصهای MATLAB مانند بیشتر زبانهای برنامه نویسی از 1 شروع میشود.
همچنین شما میتوانید بهطور همزمان چندین عنصر را با ارسال یک بردار برای هر مختصات به جای یک عدد واحد فهرست کنید.
بهعنوان مثال برای بهدست آوردن کل ردیف دوم، میتوانیم مشخص کنیم که ستونهای اول، دوم و سوم را میخواهیم:
M(2, [1,2,3]) <<
ans = 3 5 7
در متلب، بهجای وکتور [1,2,3] میتوانید از عملگر کولون و بهصورت 1:3 نیز در اندیس گذاری استفاده کنید.
استفاده از عملگر کولون، یک میانبر برای انتخاب یک سطر (یا ستون)، ارائه میدهد.
بهعنوان مثال، کد زیر کل ردیف دوم را نیز برمیگرداند:
M(2, :) <<
ans = 3 5 7
متلب همچنین یک میانبر برای تعیین آخرین عنصر یک بُعد در قالب کلمه کلیدی end ارائه میدهد.
کلمه کلیدی end دقیقاً بهگونه ای کار میکند که گویی شماره آخرین عنصر در آن بُعد است.
بنابراین اگر میخواهید همه ستونها از ستون 2 تا آخرین ستون را داشته باشید، میتوانید از نوشته زیر استفاده کنید:
M(2, 2:end) <<
ans = 5 7
اندیس گذاری زیرمجموعه میتواند محدودکننده هم باشد؛
زیرا اجازه نمیدهد مقادیر واحد از ستونها و ردیفهای مختلف استخراج شوند و ترکیبی از تمام سطرها و ستونها را استخراج میکند.
M([2,3], [1,3]) <<
= ans
5 7
2 4
برای مثال اندیس گذاری با موقعیت نمیتواند فقط عناصر M(2,1) یا M(3,3) را بازگرداند و برای این کار باید اندیس گذاری خطی را در نظر بگیریم.
2) اندیس گذاری با یک شاخص واحد
متلب به شما این امکان را میدهد که آرایههای n بُعدی را زمانی که تنها با استفاده از یک بُعد اندیس گذاری میکنید، بهعنوان آرایههای یک بُعدی در نظر بگیرید.
بهعنوان مثال با کد زیر میتوانید مستقیماً به عنصر اول دسترسی داشته باشید:
M(1) <<
ans = 8
توجه داشته باشید که آرایهها به ترتیب ستون اصلی در متلب ذخیره میشوند، به این معنی که با پایین آمدن ستونها به عناصر دسترسی پیدا میکنید.
M(2) عنصر دوم ستون اول است که اولین عنصر ستون دوم خواهد بود.
M(4) <<
ans = 1
در متلب برای تبدیل اندیسهای زیرنویس به اندیسهای خطی و بالعکس توابع داخلی sub2ind و ind2sub بهترتیب وجود دارند و شما میتوانید بهصورت دستی زیرنویسهای (r, c) را به یک شاخص خطی تبدیل کنید.
برای درک این موضوع، اگر در ستون اول باشیم، شاخص خطی به سادگی شاخص ردیف خواهد بود.
فرمول بالا برای این مورد صادق است؛ زیرا برای c = 1 و c-1 = 0 در ستونهای بعدی، شاخص خطی، شماره ردیف به اضافه تمام ردیفهای ستونهای قبلی است.
توجه داشته باشید که کلمه کلیدی end همچنان اعمال میشود و اکنون به آخرین عنصر آرایه یعنی عبارت زیر اشاره دارد:
M(end) == M(end, end) == 2
همچنین میتوانید چندین عنصر را با استفاده از اندیس گذاری شاخص واحد ایندکس کنید.
توجه داشته باشید که اگر این کار را انجام دهید، ماتریس برگشتی همان شکل ماتریسهای بردار شاخص را خواهد داشت.
M(2:4) یک بردار ردیف را برمیگرداند؛ زیرا 2:4 نشاندهنده بردار ردیف [2,3,4] است.
M(2:4) <<
ans = 3 4 1
بهعنوان مثال دیگر، M([1,2;3,4]) ماتریس 2 در 2 را برمیگرداند؛ زیرا [1,2;3,4] ماتریسی 2 در 2 هست.
برای متقاعد شدن کد زیر را اجرا کنید:
M([1,2;3,4]) <<
= ans
3 8
1 4
توجه داشته باشید که اندیس گذاری با : بهتنهایی، همیشه یک بردار ستونی را برمیگرداند:
(:)M <<
= ans
8
3
4
1
5
9
6
7
2
این مثال همچنین ترتیب خروجی متلب در هنگام استفاده از اندیس گذاری خطی را نشان میدهد.
3) اندیس گذاری با مقادیر منطقی
روش سوم اندیس گذاری استفاده از یک ماتریس منطقی است.
یعنی ماتریسی که فقط حاوی مقادیر true یا false میباشد و بهعنوان یک ماسک برای فیلتر کردن عناصری که نمیخواهید، مورد استفاده قرار میگیرد.
بهعنوان مثال، اگر بخواهیم تمام عناصر M که بزرگتر از 5 هستند را بیابیم، ماتریس زیر بهدست میآید:
M > 5 <<
= ans
1 0 1
1 0 0
0 1 0
برای اندیس گذاری M و برگرداندن فقط مقادیری که بزرگتر از 5 هستند، خروجی بهشکل زیر است:
M(M > 5) <<
= ans
8
9
6
7
اگر میخواهید این اعداد در جای خود باقی بمانند (یعنی شکل ماتریس را حفظ کنید)، میتوانید تعریف منطقی زیر را انجام دهید:
M(∼(M > 5)) = NaN <<
= ans
8 NaN 6
NaN NaN 6
NaN 9 NaN
ما میتوانیم بلوکهای کد پیچیده حاوی عبارات if و for را با استفاده از اندیس گذاری منطقی کاهش دهیم.
کد زیر را در نظر بگیرید (که قبلاً با استفاده از اندیسگذاری خطی به یک حلقه خلاصه شده است):
for elem = 1:numel(M)
if M(elem) > 5
M(elem) = M(elem) – 2;
end
end
میتوان کد بالا را با استفاده از اندیس گذاری منطقی به کد زیر کوتاه کرد:
idx = m > 5;
M(idx) = M(idx) – 2;
یا حتی کوتاه تر:
M(M>5) = M(M>5) – 2;
2-2# ماتریسهای ابعاد بالاتر
تمام روشهای ذکر شده در بالا را میتوان به ابعاد n تعمیم داد.
بهعنوان مثال اگر از ماتریس سه بعدی M3 = rand(3,3,3) استفاده کنیم، میتوانید با کد زیر به تمام سطرها و ستونهای برش دوم بُعد سوم دسترسی داشته باشید.
M(:,:,2) <<
و با استفاده از اندیس گذاری خطی زیر میتوانید به اولین عنصر قطعه دوم دسترسی پیدا کنید.
>> M(size(M,1)*size(m,2)+1)
3-2# بازگرداندن محدوده عناصر
با اندیس گذاری در متلب، اگر بیش از یک عنصر را در بیش از یک بُعد مشخص کنید، متلب هر جفت مختصات ممکن را برمیگرداند.
بهعنوان مثال، اگر M([1,2],[1,3]) را امتحان کنید، متلب M(1,3) و M(2,1) و M(1,1) و M(2,3) را برمیگرداند.
زمانی که بهدنبال عناصر لیستی از جفتهای مختصات هستید، این میتواند غیرمعمول بهنظر برسد؛ اما برفرض یک ماتریس بزرگتر را در نظر بگیرید، (A = rand(20)) توجه داشته باشید A یک ماتریس 20 در 20 است.
اگر شما بخواهید ربع بالا سمت راست را بهدست آورید، در این حالت بهجای این که مجبور باشید هر جفت مختصات را در آن ربع مشخص کنید (در این مورد 100جفت خواهد بود)، فقط 10 سطر و 10 ستونی را که می خواهید مشخص کنید (A(1:10, 11:end)).
برش یک ماتریس به این روش بسیار رایج تر از تهیه لیستی از جفت مختصات است.
در صورتی که میخواهید لیستی از جفت مختصات را دریافت کنید، سادهترین راه حل تبدیل به اندیس گذاری خطی است.
مسئلهای را در نظر بگیرید که در آن یک بردار از شاخصهای ستونی دارید که میخواهید برگردانده شوند. مثلا:
>> colIdx = [3;2;1]
بنابراین در این مورد شما در واقع میخواهید عناصر را در (1,3)، (2,2) و (3,1) برگردانید.
بنابراین با استفاده از اندیس گذاری خطی اینگونه عمل میکنید:
>> colIdx = [3;2;1]
>> rowIdx = 1:length(colIdx);
>> idx = sub2ind(size(M)), rowIdx, colIdx);
>> M(idx)
4-2# چند بار برگرداندن یک عنصر
با اندیس گذاری زیرنویس و خطی میتوانید یک عنصر را چندین بار با تکرار شاخص آن، برگردانید:
>> M ([1,1,1,2,2,2])
ans =
8 8 8 3 3 3
همچنین میتوانید از این روش برای کپی کردن کل ردیفها و ستونها برای مثال برای تکرار سطر اول و ستون آخر استفاده کنید:
>> M([1, 1:end], [1:end, end])
ans =
8 1 6 6
8 1 6 6
3 5 7 7
4 9 2 2
اندیس گذاری در متلب برای دستکاری کارآمد ماتریس بسیار مهم است و روشهای خطی، منطقی و زیرنویس را برای مدیریت دادههای متنوع ارائه میدهد.
استفاده از اندیس گذاری محدوده و کلمه کلیدی پایانی میتواند بهطور قابل توجهی عملیات آرایه را بهخصوص در مجموعه دادههای بزرگ بهینه کند.
ولی برای اطمینان از پردازش دقیق و کارآمد داده و جلوگیری از خطاهای رایج مانند خارج از محدوده، باید از اندیس گذاری منطقی نادرست اجتناب کنید.
تکنیکهای پیشرفته، از جمله اندیس گذاری آرایههای چند بعدی و جایگزینی شرطی، کلیدی برای وظایف پیچیده تجزیه و تحلیل دادهها در متلب هستند.
نظرتون درباره این مقاله چیه؟
ما رو راهنمایی کنید تا اون رو کامل تر کنیم و نواقصش رو رفع کنیم.
توی بخش دیدگاه ها منتظر پیشنهادهای فوق العاده شما هستیم.