آموزش تغییرشکل و اندازه آرایهها در متلب
به نام خدا و سلام.
به ششمین جلسه از سری جلسات آموزش رایگان نرم افزار متلب خوش آمدید. در این جلسه به تغییرشکل و اندازه و مرتب سازی ماتریسها و بردارها در متلب میپردازیم. از جلسه چهارم شروع کار با آرایهها در متلب را آغاز کردیم و در جلسه پنجم به اندیس گذاری آنها پرداختیم. دسترسی سریع به این جلسات و تمامی جلسات آموزش متلب از منوی سمت راست وجود دارد.
در این جلسه، بحث آرایهها در متلب را ادامه میدهیم. موضوع این جلسه تغییرشکل و اندازه و مرتب سازی آرایهها در متلب میباشد.
با متلب پلاس همراه باشید.
مقدمهای بر تغییرشکل و مرتب سازی آرایهها در متلب
در جلسه قبل با روشهای استخراج مقدار یا مقادیری از یک بردار یا ماتریس در متلب آشنا شدیم. حال نوبت به تغییرشکل یا اندازه یک آرایه در متلب میرسد. منظور از تغییرشکل یا اندازه یک بردار یا ماتریس، ارائه ماتریس در فرمی دیگر است. مثلا یک ماتریس 2×2 را میتوان به صورت یک ماتریس 1×4 و یا 4×1 نوشت. به این فرآیند تغییرشکل (Reshaping) میگوییم.
در مواقع دیگری نیز نیاز به مرتب سازی دادههای یک ماتریس داریم. در این فرآیند شکل و ابعاد خودِ ماتریس تغییر نمیکند بلکه نحوه چینش دادهها تغییر میکند. به این فرآیند اصطلاحا مرتب سازی (Sorting) میگوییم. توجه داشته باشید که امکان دانلود آموزش متلب pdf این جلسات نیز وجود دارد.
تغییرشکل و اندازه آرایهها در متلب
دستور reshape در متلب
به طور کلی یک ماتریس (آرایه) با ابعاد m × n درنظر میگیریم. برای تغییرشکل این ماتریس به فرم w × u برقرار بودن شرط u*w = m*n لازم است. مثلا یک ماتریس 3×2 (که دارای 6 درایه است) را نمیتوان به فرم ماتریس 2×4 نوشت. تعداد درایهها در فرآیند تغییرشکل آرایهها ثابت است. رعایت این شرط در نرم افزار متلب به عهده کاربر است. چنانچه این شرط را رعایت نکنید با خطای متلب مواجه خواهید شد.
برای تغییرشکل آرایهها در متلب از دستور reshape استفاده میشود. طرز استفاده از این دستور به صورت reshape(A,nr,nc) است. که در آن، A نام آرایه (بردار یا ماتریس)، nr تعداد سطر و nc تعداد ستون است. چنانچه یکی از بُعدهای آرایه (سطر یا ستون) برای ما مهم نباشد از علامت [ ] استفاده میکنیم. به مثالهای زیر توجه کنید.
مثال) در این مثال بردار 8 عضوی a را به 2 شکل 2×4 و 4×2 تبدیل میکنیم.
a = [1 2 3 4 5 6 7 8]
a =
1 2 3 4 5 6 7 8
b = reshape(a,2,4)
b =
1 3 5 7
2 4 6 8
c = reshape(a,4,2)
c =
1 5
2 6
3 7
4 8
d = reshape(a,5,2)
Error using reshape
To RESHAPE the number of elements must not change.
همانطور که مشاهده میکنید برای تبدیل بردار a به فرم 2×5 نرم افزار متلب ارور خطا داده است. واضح است که یک بردار 8 عضوی نمیتواند به ماتریس با 10 درایه تبدیل شود. شرط اصلی تبدیل فرم آرایهها، عدم تغییر در تعداد درایههای آنها است.
مثال) در این مثال یک ماتریس 4×4 را به یک بردار ستونی تبدیل میکنیم.
e = rand(4,4)
e =
0.6948 0.4387 0.1869 0.7094
0.3171 0.3816 0.4898 0.7547
0.9502 0.7655 0.4456 0.2760
0.0344 0.7952 0.6463 0.6797
f = reshape(e,[],1)
f =
0.6948
0.3171
0.9502
0.0344
0.4387
0.3816
0.7655
0.7952
0.1869
0.4898
0.4456
0.6463
0.7094
0.7547
0.2760
0.6797
باتوجه به اینکه قصد ستونی کردن ماتریس را داشتیم، تعداد سطر بردار نهایی اهمیت ندارد. بنابراین انتخاب تعداد سطر را به متلب واگذار کردهایم. این عمل با استفاده از براکت خالی [ ] صورت پذیرفته است.
دستور circshift در متلب
بعضی مواقع میخواهیم درایهها را در راستای سطر یا ستون جابهجا کنیم. در این صورت میتوانیم از تابع circshift استفاده کنیم. سینتکس این تابع به صورت circshift(A, [a b]) است. که در آن A ماتریس موردنظر میباشد. a تعداد جابجایی سطرها (از بالا به پایین) و b تعداد جابجایی ستونها به سمت راست میباشد. به مثال زیر دقت کنید.
g = [1 2 3; 4 5 6; 7 8 9]
g =
1 2 3
4 5 6
7 8 9
circshift(g,[1 0])
ans =
7 8 9
1 2 3
4 5 6
circshift(g,[0 1])
ans =
3 1 2
6 4 5
9 7 8
دوران ماتریس یا بردار در متلب
دوران آرایهها به مقدار 90 درجه (یا ضرایب آن) با استفاده از تابع rot90 امکان پذیر است. rot90 دو ورودی میپذیرد: ورودی اول ماتریس یا بردار است و ورودی دوم (اختیاری) تعداد دفعات دوران را مشخص میکند. مقدار پیش فرض ورودی دوم برابر 1 است. برای دوران 90 درجه نیازی به ورودی دوم نیست. برای دوران 180 درجه، عدد 2 و به همین ترتیب درنظر گرفته میشود. جهت دوران نیز به صورت پادساعتگرد است. به مثال زیر دقت کنید.
h = [5 2 1; 7 4 8; 9 0 1]
h =
5 2 1
7 4 8
9 0 1
rot90(h, 1)
ans =
1 8 1
2 4 0
5 7 9
rot90(h, 2)
ans =
1 0 9
8 4 7
1 2 5
مرتب سازی آرایهها در متلب | دستور sort
برای مرتب سازی درایههای ماتریس یا بردار در متلب از دستور sort استفاده میکنیم. شکل استفاده از این دستور به صورت sort(A, dim, direction) است. که A نام بردار یا ماتریس، dim جهت (سطر یا ستون) و direction افزایشی یا کاهشی بودن ترتیب است.
پیش فرض مرتب سازی در این دستور، مرتب سازی ستونی دادهها از بالا به پایین، کم به زیاد است. برای مرتب سازی به صورت کاهشی (از زیاد به کم) بایستی عبارت ‘descend’ را در انتهای این دستور تایپ کنیم.
همچنین برای مرتب سازی درایهها در جهت سطری، بایستی عدد 2 پس از نام ماتریس نوشته شود. به مثالهای زیر توجه نمائید.
- مثال سمت چپ) درایههای ماتریس A را در راستای ستونی یکبار از کم به زیاد و یکبار از زیاد به کم مرتب میکنیم.
- مثال سمت راست) درایههای ماتریس A را در راستای سطری یکبار از کم به زیاد و یکبار از زیاد به کم مرتب میکنیم.
A = [3 8 -1; 8 2 10; 0 -1 5]
A =
3 8 -1
8 2 10
0 -1 5
sort(A,2)
ans =
-1 3 8
2 8 10
-1 0 5
sort(A,2,'descend')
ans =
8 3 -1
10 8 2
5 0 -1
A = [3 8 -1; 8 2 10; 0 -1 5]
A =
3 8 -1
8 2 10
0 -1 5
sort(A)
ans =
0 -1 -1
3 2 5
8 8 10
sort(A,'descend')
ans =
8 8 10
3 2 5
0 -1 -1
در مواردی که میخواهیم موقعیت جدید یک مقدار در ماتریس مرتب شده را بدانیم، از خروجی دوم این تابع استفاده کنیم. خروجی دوم این تابع شاخص (index) مقدارهای قبلی را در ماتریس جدید ارائه میدهد. برای گرفتن خروجی دوم، به صورت زیر عمل میکنیم.
B =[1 18; -4 5; 6 19]
B =
1 18
-4 5
6 19
[D, I] = sort(B)
D =
-4 5
1 18
6 19
I =
2 2
1 1
3 3
ماتریس D مرتب شدهی ماتریس B است. ماتریس I محل هریک از درایههای ماتریس B را نشان میدهد. به این صورت که در ستون اول ماتریس B، ترتیب به صورت درایه دوم، اول و سوم است. این اعداد دقیقا در ستون اول ماتریس I دیده میشوند.
کار با دادههای قطری در ماتریس
درایههای قطری یک ماتریس، دادههای مهمی برای تحلیلهای مهندسی میباشند. بسیاری از این موارد با استفاده از دستور diag قابل انجام میباشد.
استخراج درایههای قطری ماتریس | دستور diag
برای استخراج درایههای روی قطر یک ماتریس، از دستور diag استفاده میشود. اگر این دستور را برای یک ماتریس استفاده کنیم، درایههای روی قطر اصلی را میدهد. این دستور درایههای روی قطرهایی غیر از قطر اصلی را نیز میدهد. برای این کار، شماره قطر نسبت به قطر اصلی را وارد میکنیم. به مثال زیر توجه کنید.
A = [1 3 5; -2 3 12; 0 7 9];
diag(A)
ans =
1
3
9
diag(A,1)
ans =
3
12
diag(A,-1)
ans =
-2
7
دقت کنید که عدد 1 به معنای استخراج درایههای قطر بالاییِ قطر اصلی است. همچنین عدد 1- نیز به معنای استخراج درایههای قطر پایینِ قطر اصلی است.
ایجاد یک ماتریس قطری با درایههای مشخص
با استفاده از دستور diag میتوان یک ماتریس قطری ایجاد کرد. در این حالت ورودی باید یک بردار باشد. در حالت پیشفرض، این دستور درایههای برداری را روی قطر اصلی قرار میدهد. اما میتوان شماره قطری که میخواهیم درایهها روی آن قرار بگیرند را بعنوان ورودی وارد کنیم. به مثال زیر دقت کنید.
u = [1 8 4];
diag(u)
ans =
1 0 0
0 8 0
0 0 4
diag(u,1)
ans =
0 1 0 0
0 0 8 0
0 0 0 4
0 0 0 0
diag(u,-1)
ans =
0 0 0 0
1 0 0 0
0 8 0 0
0 0 4 0
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) یک ماتریس تصادفی با ابعاد 6×6 (با دستور rand) ایجاد کنید. این ماتریس را به صورت ماتریسهای 4×9، 9×4، 12×3 و 3×12 بنویسید.
تمرین دوم) یک ماتریس 4×4 تصادفی (با دستور rand) ایجاد کنید. یکبار ابتدا سطرهای این ماتریس و سپس ستونهای آن را جابجا کنید. سپس، ابتدا ستونهای آن و سپس سطرهای آن را جابجا کنید. چه نتیجهای میگیرید؟
تمرین سوم) درایههای قطر اصلی یک ماتریس تصادفی 3×3 (به نام A) را بدست آورید. با این درایهها یک ماتریس قطری جدید به نام B بسازید. حال ماتریس B را از ماتریس A کم کنید (A-B). ماتریس حاصل چه ویژگیای دارد؟ چه نتیجهای میگیرید؟
جمعبندی
خب! ششمین جلسه از سری جلسات آموزش رایگان نرم افزار متلب به پایان رسید. این جلسه درباره تغییرشکل و اندازه و مرتب سازی آرایهها و همچنین دادههای قطری ماتریس صحبت کردیم. سعی ما انتقال مفاهیم به زبانی ساده و ارائه مثالهای متنوع بود. هدف اصلی تیم متلب پلاس ارائه آموزش متلب به صورت حرفهای و رایگان است. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هر گونه سوال یا ابهامی در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
4 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام و روزبخیر.
ببخشید روشی غیر از دستور reshape برای سطری کردن یک ماتریس در متلب وجود دارد؟
سلام سعید عزیز
برای تبدیل یک ماتریس به بردار، میتوان بجای استفاده از دستور reshape، از عبارت ساده زیر استفاده کرد. اگر A یک ماتریس باشه،
(:)A
ماتریس رو به بردار ستونی تبدیل میکنه.
دستور ‘(:)A هم ماتریس A رو به یک بردار سطری تبدیل خواهد کرد.
با این روش بدون نیاز به دستور خاص، میشه ماتریس رو در متلب به بردار تبدیل کرد.
سلام وقت بخیر
در کد زیر فقط مقادیر آخر c حلقه در دسترس هست. برای اینکه به مقادیر قبلی c از حلقه در یک بردار یا ماتریس دسترسی داشته باشیم چه باید کرد؟
;a=[1,2;3,3;2,4;4,5]
b=[-1,2;2,1]
for i=1:4
for j=1:2
;c=[a(i,:),b(j,:)]
end
end
سلام و عرض ادب
شما در کدنویسی جوری عمل کردید که c فقط محاسبه میشه و درجایی ذخیره نمیشه. برای اینکه همه مقادیر c رو داشته باشید، در هر مرحله (تکرار) اون رو در یک ماتریس دلخواه ذخیره کنید.
موفق باشید.