آرایه رشتهای در متلب
به نام خدا و سلام.
به جلسه اول از سری جلسات آموزش متلب پیشرفته خوش آمدید. سری جلسات آموزش متلب پیشرفته، توسط متلبپلاس ارائه میشود. در این جلسه به آموزش آرایه رشتهای در متلب بطور کامل میپردازیم. سعی میکنیم همه مباحث پیرامون رشته ارائه و بررسی شود.
با متلبپلاس همراه باشید.
از آرایه رشتهای (String Arrays) برای ذخیره و تحلیل تکههای متن (که معمولا نسبت به آرایه کاراکتر طولانیتر است) استفاده میشود. آرایههای رشتهای مجموعهای از توابع کاربردی را برای کار با متن به عنوان داده ارائه میکنند. آرایههای رشتهای در متلب نسخه R2016b معرفی شدند و از آن به بعد در همه نسخهها پشتیبانی میشوند. رشتهها برای تحلیل روی متن بعنوان یک نوع داده (مثل داده عددی) ارائه شدهاند. انواع ویرایشهای مختلف را با استفاده از توابع متلب میتوان روی آرایه رشته پیاده سازی کرد. حذف یا اضافه کردن متن، جستجو و جایگزینی متن، استخراج بخشی از متن و … از این موارداند.
آرایههای رشته را با استفاده از عملیات استاندارد آرایهها میتوان ویرایش کرد. مواردی مانند اندیس گذاری، تغییرشکل (Reshape) و الحاق (Concatenate) که در کار با آرایهها در متلب بطور کامل به آنها اشاره شدهاست.
بطور کلی برای ایجاد آرایه رشتهای در متلب، دو روش داریم. قراردادن متن درون دو کوتیشن و یا استفاده از دستور string.
ایجاد آرایه رشتهای در متلب با استفاده از کوتیشن
یک رشته را میتوان با قرار دادن متن درون دو کوتیشن ” (Double Quotation) ایجاد نمود. این نحوه ایجاد آرایه رشتهای از نسخه متلب R2017a معرفی شدهاست. متلب نیز رشتهها را درون نماد نقل قول نمایش میدهد.
str = "Welcome to MatlabPlus!"
پس از اجرا، داریم:
str =
"Welcome to MatlabPlus!"
یکی از راههای ایجاد یک آرایه رشتهای، ایجاد آنها با استفاده از براکت است. دقیقا همانطور که اعداد را درون یک ماتریس (آرایه) ایجاد میکنیم. مثلا یک آرایه رشتهای 3×2 ایجاد میکنیم.
str = ["Mercury","Gemini","Apollo";
"Skylab","Skylab B","ISS"]
str =
2×3 string array
"Mercury" "Gemini" "Apollo"
"Skylab" "Skylab B" "ISS"
ایجاد آرایه رشتهای در متلب با دستور string
این دستور از متلب R2016b ارائه شدهاست.
سینتکس دستور string در متلب
str = string(A)
دستور string(A) آرایه ورودی A را به آرایه رشته تبدیل میکند. نوع داده A تعیین میکند که این دستور چگونه A را به آرایه رشتهای تبدیل میکند. حالتهایی که ممکن است ورودی A داشته باشند، بصورت زیر است:
- اگر A یک بردار کاراکتر باشد، این دستور A را به یک رشته اسکالر تبدیل میکند. خروجی str و ورودی A دارای کاراکترهای یکسان به ترتیب یکسان هستند.
- اگر A یک آرایه سلولی (cell array) یا یک آرایه طبقه بندی (categorical array) باشد، آنگاه string هر عنصر در A را به عنصر رشتهای در str تبدیل میکند.
- اگر A یک آرایه عددی باشد، string هر عدد را به یک عنصر رشته در str تبدیل میکند. برخلاف تابع char، string با اعداد به عنوان کدهای ASCII یا ®Unicode رفتار نمیکند.
- اگر A یک آرایه منطقی باشد، string هر مقدار را به “false” یا “true” تبدیل میکند.
- اگر A [ ] باشد، string یک آرایه رشتهای 0×0 را برمیگرداند.
تبدیل کاراکتر به رشته با دستور string
همانطور که گفته شد، میتوان آرایه کاراکتر را با استفاده از تابع string به آرایه رشته تبدیل کرد. برای مثال:
chr = 'MatlabPlus Course';
str = string(chr)
str =
"MatlabPlus Course"
در اینجا لازم است به یک تفاوت اساسی بین آرایه کاراکتری و رشتهای اشاره کنیم. همانطور که گفته شد، آرایه کاراکتر یک بردار یک در n (به تعداد طول کاراکتر) ایجاد میکند. این درحالیست که آرایه رشتهای دارای عناصری است که هر کدام میتواند یک بردار از کاراکترها باشد. برای درک بهتر به مثال زیر دقت کنید.
chr = 'MatlabPlus Course';
str = "MatlabPlus Course" ;
whos
دستور whos برای نمایش جزئیات بکار میرود. پس از اجرای دستورات فوق داریم:
Name Size Bytes Class Attributes
chr 1x17 34 char
str 1x1 190 string
مشاهده میشود که chr (کاراکتر) یک بردار با ابعاد یک در 17 است. درحالی که str (رشته) یک آرایه یک در یک 1×1 میباشد. سایز آرایه کاراکتر عبارت به اندازه تمام حروف، نمادها و فاصلههای عبارت MatlabPlus Course است.
برای بدست آوردن اندازه طول یک آرایه رشتهای میتوان از تابع strlength استفاده کرد.
str = "MatlabPlus Course" ;
strlength(str)
ans =
17
دستور strlength برای بدست آوردن طول رشتههای آرایه رشتهای نیز استفاده میشود. مثلا اگر این دستور را روی یک آرایه رشتهای 3×2 بکار ببریم، داریم:
str = ["Mercury","Gemini","Apollo";
"Skylab","Skylab B","ISS"];
strlength(str)
ans =
7 6 6
6 8 3
تبدیل آرایه سلولی به رشته با دستور string
با استفاده از دستور string علاوه بر آرایه کاراکتر، یک آرایه سلولی را نیز میتوان به رشته تبدیل نمود. برای درک بهتر به مثال زیر دقت کنید. در این مثال ابتدا یک آرایه سلولی به نام A ایجاد میکنیم. سپس این آرایه را به رشته تبدیل میکنیم.
A = {'Mercury','Gemini','Apollo';...
'Skylab','Skylab B','ISS'}
A =
2×3 cell array
{'Mercury'} {'Gemini' } {'Apollo'}
{'Skylab' } {'Skylab B'} {'ISS' }
str = string(A)
str =
2×3 string array
"Mercury" "Gemini" "Apollo"
"Skylab" "Skylab B" "ISS"
تبدیل آرایه عددی به رشته با دستور string
میتوان بردار (آرایه) عددی را با دستور string به رشته تبدیل نمود.
A = [77 65 84 76 65 66];
str = string(A)
str =
1×6 string array
"77" "65" "84" "76" "65" "66"
str یک آرایه رشتهای است که در آن هر عنصر یک عدد از A را نشان میدهد. توجه داشته باشید که string با اعداد بهعنوان کدهای ASCII یا ®Unicode مانند تابع char رفتار نمیکند.
تبدیل رشته به آرایه عددی با دستور double
چنانچه آرایه رشته تنها شامل عدد باشد، میتوان آن را به بردار عددی (از جنس عدد) تبدیل نمود. برای این منظور از دستور double استفاده میشود.
str = ["256","3.1416","8.9e-3"];
X = double(str)
X =
256.0000 3.1416 0.0089
دسترسی به درایههای آرایه رشتهای در متلب
میتوان به رشتهها در یک آرایه رشتهای با اندیس گذاری ماتریسی دسترسی داشت. دقیقا همانطور که به عناصر یک آرایه عددی (مثل ماتریس) دسترسی داریم. برای درک بهتر به مثال زیر توجه کنید. ابتدا یک آرایه رشتهای 3×2 ایجاد میکنیم.
str = ["Mercury","Gemini","Apollo";
"Skylab","Skylab B","ISS"]
str =
2×3 string array
"Mercury" "Gemini" "Apollo"
"Skylab" "Skylab B" "ISS"
مثلا برای دسترسی به درایه سطر اول، ستون دوم ازین آرایه رشتهای، داریم:
str(1,2)
ans =
"Gemini"
همچنین برای دسترسی به کل درایههای ستون سوم ازین آرایه، داریم:
str(:,3)
ans =
2×1 string array
"Apollo"
"ISS"
با استفاده از اندیس گذاری میتوان آرایه رشتهای را گسترش نیز داد. مثلا میدانیم که آرایه رشتهای فوق دارای 2 سطر و 3 ستون است. این آرایه را به یک آرایه 4×3 (دارای 3 سطر و 4 ستون) تبدیل میکنیم. به این صورت که به درایه روی سطر سوم و ستون چهارم، یک رشته اختصاص میدهیم.
str(3,4) = "Mir"
str =
3×4 string array
"Mercury" "Gemini" "Apollo"
"Skylab" "Skylab B" "ISS"
"Mir"
با توجه به اینکه سایر درایههای این آرایه را اختصاص ندادهایم، با مقدار missing مشخص شدهاست.
تفاوت فراخوانی رشته با پرانتز و آکولاد (براکت)
در اندیس گذاری (فراخوانی) درایههای آرایه رشتهای چنانچه با پرانتز فراخوانی کنیم، خروجی از جنس رشته است. اما چنانچه فراخوانی را با استفاده از براکت (آکولاد) انجام دهیم، خروجی از جنس کاراکتر خواهد بود (مشابه آرایه سلول در متلب). به مثال زیر دقت کنید.
str = ["Mercury","Gemini","Apollo";
"Skylab","Skylab B","ISS"];
a = str(2,2)
a =
"Skylab B"
b = str{2,2}
b =
'Skylab B'
به خروجی ارائه شده a و b دقت کنید. واضح است که خروجی a از نوع رشته و خروجی b از نوع کاراکتر است. با استفاده از دستور whos این خروجیها را چک میکنیم.
whos a b
Name Size Bytes Class Attributes
a 1x1 174 string
b 1x8 16 char
مشاهده میشود که کلاس a از نوع string و کلاس b از نوع char است. بنابراین با توجه به نوع کاربرد، میتوان فراخوانی روی آرایه رشته را انجام داد.
الحاق (اتصال) آرایه رشتهای در متلب
رشتهها در یک آرایه رشتهای کاملا مشابه با سایر انواع آرایهها به هم متصل میشوند. دو آرایه رشتهای با استفاده از براکت [ ] به هم متصل میشوند. به مثالهای زیر دقت کنید.
اتصال دو آرایه رشتهای روی یک سطر
str1 = ["Mercury","Gemini","Apollo"];
str2 = ["Skylab","Skylab B","ISS"];
str = [str1 str2]
str =
1×6 string array
"Mercury" "Gemini" "Apollo" "Skylab" "Skylab B" "ISS"
اتصال دو آرایه رشتهای روی دو ستون
str1 = ["Mercury","Gemini","Apollo"];
str2 = ["Skylab","Skylab B","ISS"];
str = [str1' str2']
لازم به ذکر است که عملگر پرایم (‘) باعث ترانهاده (Transpose) شدن آرایه میشود. پس از اجرای دستورات فوق داریم:
str =
3×2 string array
"Mercury" "Skylab"
"Gemini" "Skylab B"
"Apollo" "ISS"
ویرایش آرایه رشته در متلب
در اینجا چند مورد کاربردی از بحث آرایه رشته در متلب ارائه میشود. برای این منظور یک آرایه رشتهای ساده در نظر میگیریم. عبارت زیر یک جمله معروف از نمایشنامه ریچارد سوم، اثر شکسپیر است.
str = "A horse! A horse! My kingdom for a horse!"
str =
"A horse! A horse! My kingdom for a horse!"
در مرحله اول قصد داریم علامت تعجب ! را از این رشته حذف کنیم. برای حذف از دستور erase استفاده میکنیم. این دستور دو ورودی میگیرد. ورودی اول نام رشته و ورودی دوم عبارت موردنظر برای حذف است.
str = erase(str,"!")
str =
"A horse A horse My kingdom for a horse"
علامت ! حذف شد.
حال تمام حروف بزرگ این متن را به حروف کوچک انگلیسی تبدیل میکنیم. برای این کار از دستور lower استفاده میشود.
str = lower(str)
str =
"a horse a horse my kingdom for a horse"
دقت داشته باشید که برای تبدیل حروف کوچک به حروف بزرگ از دستور upper استفاده میشود.
در این مرحله با استفاده از دستور split فاصلههای موجود در آرایه رشته را حذف میکنیم. در دستور split چنانچه رشته اسکالر باشد (یک سطر داشته باشد)، خروجی ستونی خواهد بود.
str = split(str)
str =
9×1 string array
"a"
"horse"
"a"
"horse"
"my"
"kingdom"
"for"
"a"
"horse"
برای بدست آوردن عبارتهای یونیک (غیر تکراری) از یک رشته متنی از دستور unique استفاده میشود. این تابع را روی نتیجه آخرین مرحله اعمال میکنیم.
str = unique(str)
str =
5×1 string array
"a"
"for"
"horse"
"kingdom"
"my"
افزودن متن به آرایه رشته در متلب
با استفاده از دستور plus یا اپراتور + میتوان متن (حتی از نوع کاراکتر یا سلول) را به رشته اضافه کرد. به مثالهای زیر دقت کنید.
مثال 1)
names = ["Mary";"John";"Elizabeth";"Paul";"Bob"];
names = names + ' Smith'
names =
5×1 string array
"Mary Smith"
"John Smith"
"Elizabeth Smith"
"Paul Smith"
"Bob Smith"
مثال 2)
names = ["Mary";"John";"Elizabeth";"Paul";"Bob"];
lastnames = ["Jones";"Adams";"Young";"Burns";"Spencer"];
names = names + " " + lastnames
names =
5×1 string array
"Mary Jones"
"John Adams"
"Elizabeth Young"
"Paul Burns"
"Bob Spencer"
مثال 3)
آرایه رشتهای names بصورت زیر داده شدهاست. هر سطر شامل نام و نام خانوادگی میباشد. درایههای این آرایه را براساس نام خانوادگی مرتب سازی کنید. بهتر است نام خانوادگی را از ستون دوم به ستون اول منتقل کنید و یک کاما به انتهای آن اضافه کنید. از دستور sort (برای مرتب کردن) و join که کار آن برعکس دستور split است استفاده کنید.
names = ["Mary Jones";"John Adams";"Elizabeth Young";"Paul Burns";"Bob Spencer"];
ابتدا با استفاده از دستور split نام و نام خانوادگی را از یکدیگر جدا میکنیم.
names = split(names)
names =
5×2 string array
"Mary" "Jones"
"John" "Adams"
"Elizabeth" "Young"
"Paul" "Burns"
"Bob" "Spencer"
حال جای ستون اول و دوم را باهم عوض میکنیم. همچنین یک کاما (,) به انتهای نام خانوادگی اضافه میکنیم.
names = [names(:,2) names(:,1)];
names(:,1) = names(:,1) + ','
names =
5×2 string array
"Jones," "Mary"
"Adams," "John"
"Young," "Elizabeth"
"Burns," "Paul"
"Spencer," "Bob"
حال با استفاده از تابع join نام و نام خانوادگی را بهم اضافه میکنیم. دستور join یک فاصله (space) بین درایههای هر سطر اضافه کرده و آنها را کنار هم قرار میدهد. خروجی یک آرایه رشتهای 1×5 است.
names = join(names)
names =
5×1 string array
"Jones, Mary"
"Adams, John"
"Young, Elizabeth"
"Burns, Paul"
"Spencer, Bob"
در نهایت با استفاده از دستور sort درایهها را مرتب میکنیم.
names = sort(names)
names =
5×1 string array
"Adams, John"
"Burns, Paul"
"Jones, Mary"
"Spencer, Bob"
"Young, Elizabeth"
جستجوی متن در آرایه رشتهای در متلب
برای جستجو در متن یک رشته متلب دستوراتی نظیر contains، startsWith و endsWith را ارائه کردهاست. دستور contains وجود یا عدم وجود یک کاراکتر را در آرایههای رشته بررسی میکند. دستور startsWith شروع شدن با یک کاراکتر و endsWith پایان یافتن با کاراکتر مشخص را بررسی میکند. در مثال زیر این موارد را بررسی میکنیم.
str = ["Rosemary Jack Jones","Peter Michael Smith","Jack Marie Young"]
str =
1×3 string array
"Rosemary Jack Jones" "Peter Michael Smith" "Jack Marie Young"
a = contains(str,"Jack")
a =
1×3 logical array
1 0 1
برای بدست آوردن موارد جستجو شده، خروجی contains را بصورت اندیس به آرایه رشته میدهیم.
matches = str(a)
matches =
1×2 string array
"Rosemary Jack Jones" "Jack Marie Young"
دقت کنید که با استفاده از دستور strfind نیز میتوان روی آرایه رشته جستجو کرد. این دستور شماره اندیس را بعنوان خروجی میدهد.
b = strfind(str,"Jack")
b =
1×3 cell array
{[10]} {0×0 double} {[1]}
حال با استفاده از تابع startsWith شروع شدن رشته با متن (کاراکتر) مشخص را پیدا میکنیم.
c = startsWith(str,"Jack");
matches = str(c)
matches =
"Jack Marie Young"
بطور مشابه تابع endsWith رشتههایی که با متن (کاراکتر) مشخص پایان مییابند را پیدا میکند.
جایگزین کردن متن آرایه رشته در متلب
در متلب با استفاده تابع replace و یا strrep میتوان متن دلخواه را با متن موجود در رشته جایگزین کرد. تابع replace نسبت به تابع strrep جدیدتر بوده و پیشنهاد میشود از آن استفاده کنید.
str = "Rosemary Jones";
newStr = replace(str,"mary","anne")
newStr =
"Roseanne Jones"
همچنین با استفاده از دستور replace میتوان به یکباره چند متن را جایگزین متن قبل نمود.
str = ["Rosemary Jack Jones","Peter Michael Smith","Jack Marie Young"];
oldText = ["Jack","Michael"];
newText = ["Beth","John"];
newStr = replace(str,oldText,newText)
newStr =
1×3 string array
"Rosemary Beth Jones" "Peter John Smith" "Beth Marie Young"
لازم به ذکر است که تابع replaceBetween نیز در متلب برای جایگزین کردن متن وجود دارد. با استفاده از این دستور میتوان متن دلخواه را بین دو بخش از رشته متنی جایگزین کرد.
برای مشاهده تمام دستوراتی که با رشته متنی و ویرایش آن مرتبط است، میتوانید به مقاله دستورات رشته متنی در متلب مراجعه نمائید.
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) آرایههای رشتهای str1 و str2 بصورت زیر داده شده است:
str1 = ["Matlab", "Plus", ".com"];
str2 = ["Advanced", "Matlab", "course"];
- این آرایهها را در یک آرایه جدید سطری 6×1 کنار هم قرار دهید.
- با بکار بردن تابع join روی str1 و str2 آنها را به آرایههای 1×1 تبدیل کرده و سپس بصورت سطری در یک آرایه جدید 2×1 قرار دهید.
- با بکار بردن تابع join روی str1 و str2 آنها را به آرایههای 1×1 تبدیل کرده و سپس بصورت ستونی در یک آرایه جدید 1×2 قرار دهید.
تمرین دوم) آرایه رشتهای str2 فوق را به یک آرایه 1×1 تبدیل نموده و سپس عبارت Free را با عبارت Advanced جایگزین نمائید.
تمرین سوم) اندازه طول هریک از آرایههای رشتهای str1 و str2 را بدست آورید.
جمعبندی
اولین جلسه از مجموعه جلسات آموزش متلب پیشرفته به پایان رسید. این جلسه به آموزش آرایه رشته در متلب و نکات پیرامون آن پرداختیم. هدف اصلی تیم متلبپلاس ارائه آموزش متلب به صورت کاملا دقیق و به زبان ساده است. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
از فهرست سمت راست هم میتونید به سایر جلسات دسترسی داشته باشید.
دیدگاهتان را بنویسید