رشته در متلب
در این جلسه از آموزش رایگان متلب، میخواهیم کار با رشته ها در متلب را یاد بگیریم. رشته ها نوع دیگری از دادهها هستند. ما در این جلسه نحوه ایجاد رشته در متلب را خواهیمآموخت. همچنین کار با رشته ها در متلب را نیز بررسیخواهیمکرد. نحوه مقایسه دو رشته درمتلب ، اتصال رشته ها در متلب ، دستور upper درمتلب ، دستور lower در متلب و … را نیز بررسیخواهیمکرد.
تعریف رشته در متلب
تعریف رشته در متلب شبیه به تعریف متغیر عددی است. اما یک تفاوت اساسی وجود دارد. رشته در متلب باید بین دو علامت single quotation «’» قرار داده شوند. علامت «’» رشتهها را از توابع و دستورها متمایز میکند. اما کامپیوتر چگونه یک رشته را میفهمد؟ کامپیوترها فقط اعداد را میفهمند! رشتهها ذاتا برای کامپیوترها تعریف نشدهاند. در کامپیوتر برای هر حرف، کاراکتر یا حتی عدد، یک عددِ خاص یا به بیان دقیقتر یک کد اختصاص داده شده است. به این کد، کد ASCII گفته میشود. عبارت ASCII مخفف American Standard Code for Information Interchange است. در تصویر زیر لیستی از کاراکترها و کد ASCII مربوط به آنها نمایش داده شده است.
در این تصویر مشاهده میشود که به هر کاراکتر یک کد اختصاص داده شده است. وقتی کاربر مثلا دکمه A را روی کیبورد فشار میدهد، کامپیوتر حرف a را نمیبیند، بلکه کد ASCII برابر با 97 را میبیند! برای تعریف یک رشته در متلب، کافی است بنویسیم:
>> x = 'b'
x = 'b'
یعنی ما حرف b یا کد ASCII مربوط به حرف b را در متغیر x ذخیره کردهایم. تعریف کلمه یا جمله نیز به همین ترتیب است.
>> y = 'Hello World!'
y = 'Hello World!'
توجه دقت کنید، حتما باید از علامت ‘ استفاده کنید نه “. همین جلسه در مورد ” نیز خواهیم گفت.
اما از کجا معلوم که کد ASCII این رشتهها در متغیر x و y ذخیره شده باشد؟ خب بیایید مثلا x را با یک جمع کنیم و ببینیم چه اتفاقی میافتد:
>> x + 1
ans = 99
مشاهده میکنید که نتیجه یک عدد است! اما چرا 99؟ در شکل 1، کد اسکی مربوط به حرف b را پیدا کنید. مشاهده میکنید که کد اسکی b برابر با 98 است. 99 میشود 98 بعلاوه 1! پس زمانی که عملیات ریاضی روی یک متغیر از نوع char انجام دهیم، این عملیات روی کد اسکی آن انجام خواهد شد و نتیجه نیز یک عدد خواهد بود! حالا اگر بنویسیم y+1 چه میشود؟
>> y + 1
ans = 73 102 109 109 112 33 88 112 115 109 101 34
خب اینها چه هستند؟ اینها هم کد اسکی هستند. پس اگر رشتهها را به شکلی که گفته شد، ذخیره کنیم، به نظر میآید که به صورت یک آرایه ذخیره خواهند شد! هر کدام از اعدادی که مشاهده میکنید نتیجه جمع کردن کد اسکی هرکدام از حروف جمله “!Hello World” با عدد یک هستند.
>> txt = 'A horse! A horse! My kingdom for a horse!'
txt = 'A horse! A horse! My kingdom for a horse!'
محاسبه طول رشته ها در متلب
همانطور که در بخش قبل گفتیم یک جمله به نظر میآید که به صورت یک بردار ذخیره میشود. حالا ما میخواهیم بدانیم که آیا میتوانیم از size و length (مثل بردارها) برای رشته ها هم استفاده کنیم؟ خب امتحان کنیم!
دستور length در متلب
از length شروع میکنیم:
>> length(x)
ans = 1
>> length(y)
ans = 12
خب میبینید که طول x، یک و طول y، برابر با 12 است! دقت کنید که spaceها هم یک عنصر تعریف میشوند! در شکل 1 هم مشاهده میکنید که space هم کد اسکی دارد و آن برابر با 32 است! پس length به ما میگوید یک رشته، با احتساب spaceها، چند کاراکتر دارد.
>> size(txt)
ans = 1 41
دستور size در متلب
خب حالا از size استفاده کنیم ببینیم چه میشود:
>> size(x)
ans = 1 1
>> size(y)
ans = 1 12
مشاهده میکنید که size دو خروجی دارد. که اولین خروجی تعداد سطرها و دومین خروجی تعداد ستونها را نشان میدهد، درست مثل آرایههای عددی!
>> length(txt)
ans = 41
اندیس دهی در رشته ها
در بخش قبل دیدیم که متلب با رشتهها تقریبا مانند یک آرایه رفتار میکند. از این رو اندیسدهی به رشتهها نیز امکانپذیر است! اندیسدهی به رشتهها دقیقا مانند آرایههای عددی است. متغیر y را در نظر بگیرید. اگر یادتان باشد ما عبارت “!Hello World” را در آن ذخیره کردیم. حالا مثلا فرض کنید بخواهیم حرف “o” را با اندیسدهی استخراج کنیم. این حرف پنجمین حرف از عبارت “!Hello World” است. بنابراین باید بنویسیم:
>> y(5)
ans = 'o'
خب ما موفق شدیم حرف ‘o’ را استخراج کنیم! حالا اگر بخواهیم کلمه world را استخراج کنیم چه؟ کافی است بنویسیم:
>> y(7 : end-1)
ans = 'World'
>> txt(22 : 28)
ans = 'kingdom'
دستور lower در متلب
در یک جمله انگلیسی حروف کوچک یا بزرگ وجود دارند. گاهی تمایل داریم که همه حروف از یک جمله یا عبارت به صورت حروف بزرگ یا کوچک نوشته شوند. برای این منظور توابع خاصی در متلب وجود دارد. توابع upper و lower برای این کار هستند. مثلا برای اینکه تمام حروف “!Hello World” را کوچک کنیم کافی است از تابع lower به صورت زیر بنویسیم:
>> lower(y)
ans = 'hello world!'
مشاهده میکنید که حرف ‘H’ به ‘h’ و حرف ‘W’ به ‘w’ تبدیل شده است!
دستور upper در متلب
حالا فرض کنید بخواهیم تمامی حروف “!Hello World” را تبدیل به حروف بزرگ کنیم. برای این کار کافی است از دستور upper به صورت زیر استفاده کنید:
>> upper(y)
ans = 'HELLO WORLD!'
مشاهده میکنید تمام حروف تبدیل به حروف بزرگ شدهاند!
>> upper(txt)
ans = 'A HORSE! A HORSE! MY KINGDOM FOR A HORSE!'
استفاده از : برای رشته ها
برای رشتهها میتوان از عملگر کولن (:) استفاده کرد! با این کار میتوانید رنجی از رشتهها را تولید کنید. مثلا فرض کنید بخواهم حروف a تا z را داشته باشیم. یک راه این است که تک تک حروف را وارد کنیم. اما راه آسانتری وجود دارد و آن هم استفاده از کولن است. برای این کار کافی است بنویسیم:
>> z = 'a' : 'z'
z = 'abcdefghijklmnopqrstuvwxyz'
شما حتی میتوانید چند حرف در میان حروف را انتخاب کنید! مثلا برای اینکه حروف الفبا را 3 در میان داشته باشیم، باید بنویسیم:
>> p = 'a':3:'z'
p = 'adgjmpsvy'
نکته دقت کنید که وقتی به متلب میگوییم ‘z’ : ‘a’ متلب حروف a تا z را به ما تحویل میدهد. اما به این معنی نیست که متلب میفهمد اینها حروف الفبا هستند و ترتیبشان اینطور است!
متلب حروف الفبا یا ترتیبشان را نمیداند. پس چطور حروف الفبا را پشت هم مینویسد؟ در واقع به این دلیل است که کد اسکی a تا z پشت هم است! نگاهی به شکل 1 بیندازید. با مثال زیر احتمالا این مسئله را کامل درک خواهید کرد:
>> q = '&' : '-'
q = '&'()*+,-'
بنابراین میتوان کاراکترها را به ترتیب کد اسکی آنها نمایش داد!
>> 'A' : 4 : 'Z'
ans =
‘AEIMQUY’
چسباندن رشته ها در متلب
رشتهها را میتوان در متلب به هم چسباند. برای این کار کافی است از کروشه استفاده کنیم. مثلا فرض کنید بخواهیم برای ساخت Howsam، دو عبارت How و sam را به هم بچسبانیم. برای این کار کافی است بنویسیم:
>> ['How', 'sam']
ans = 'Howsam'
شما میتوانید بین دو کلمه فاصله یا علامت هم بگذارید. مثلا شاید بخواهید با دو کلمه How و sam، عبارت “!How sam” را بسازید. برای این کار کافی است بنویسید:
>> ['How', ' ', 'sam', '!']
ans = 'How sam!'
استفاده از findstr
برای یافتن یک عبارت در یک رشته در متلب میتوان از دستور findstr استفاده کرد. این دستور دو ورودی میگیرد. ورودی اول یک رشته است. ورودی دوم عبارتی است که میخواهیم در رشتهای که اول وارد کردیم، پیدا کنیم. این دستور index عبارت مورد نظر در رشته را نشان میدهد. برای مثال فرض کنید بخواهیم عبارت ‘Wor’ را در متغیر y پیدا کنیم. برای این کار مینویسیم:
>> findstr(y, 'Wor')
ans = 7
مشاهده میکنید که خروجی دستور findstr، یک اندیس است که نشان میدهد اولین حرف از عبارت موردنظر ما چه اندیسی دارد. حالا اگر عبارت موردنظر ما وجود نداشته باشد چه؟ مثلا اگر بنویسیم:
>> findstr(y, 'Hi')
ans = []
مشاهده میکنید که دستور findstr یک براکت خالی برمیگرداند!
>> findstr(txt, 'horse')
ans = 3 12 36
دستور strcmp در متلب
در بخش قبل توانستیم یک عبارت را دریک رشته جستجو کنیم. در این بخش میخواهیم دو رشته را با هم مقایسه کنیم. مثلا فرض کنید یک اپلیکیشن دارید. شما میخواهید با متلب برنامهای بنویسید که روی این اپلیکیشن رمز بگذارید. رمزی که شما در نظر گرفتهاید “matlab2019” باشد. شما از کاربر میخواهید رمز را وارد کند. چطور بفهمید که رمز وارد شده درست است یا نه. قطعا رمز وارد شده را باید با “matlab2019” مقایسه کنید و ببینید یکی هستند یا نه. برای مقایسه رشته ها در متلب میتوانید از دستور strcmp استفاده کنید. فرض کنید کاربر رمز را ‘python’ وارد کرده است. برای مقایسه کافی است بنویسیم:
>> strcmp(pass, 'matlab2019')
ans = logical 0
مشاهده میکنید که خروجی، عدد صفر است. خروجی strcmp دو حالت دارد! یا صفر است یا یک. اگر صفر باشد یعنی جواب منفی است! اگر یک باشد یعنی جواب مثبت است. پس اگر خروجی strcmp، صفر باشد یعنی دو رشته برابر نیستند. اگر یک باشد یعنی دو رشته برابر هستند.
دستور strcmpi در متلب
هدف از دستور strcmpi، مانند strcmp، مقایسه رشته ها در متلب است. با این تفاوت که به حروف کوچک و بزرگ حساس نیست. در نظر strcmp دو عبارت ‘matlab’ و ‘MATLAB’ یکسان نیستند! اما strcmpi این دو عبارت را یکی میداند. بیایید امتحان کنیم:
>> strcmp('MATLAB', 'matlab')
ans = logical 0
>> strcmpi('MATLAB', 'matlab')
ans = logical 1
مشاهده میکنید که خروجی strcmpi، یک است. یعنی دو رشته برابر هستند. در صورتی که خروجی strcmp، صفر است. خروجی strcmpi نیز دو حالت دارد، یک یا صفر. اگر دو رشته برابر باشند، خروجی یک و اگر برابر نباشند، صفر است.
استفاده از class در رشته ها
اگر یادتان باشد در جلسه ترفندهای 2 با دستوری به نام class آشنا شدیم. این دستور نوع متغیر را برمیگرداند. حالا بیایید در مورد دو متغیر x و y از دستور class استفاده کنیم:
>> class(x)
ans = 'char'
>> class(y)
ans = 'char'
مشاهده میکنید که هردو متغیر از نوع char هستند. عبارت char مخفف character است. پس علاوه بر دادههایی که قبلا با آنها آشنا شدیم، یک نوع دیگر از داده به نام char در متلب وجود دارد که برای ذخیره کردن رشتهها استفاده میشود.
تبدیل کد اسکی به کاراکتر در متلب
برای تبدیل کد اسکی به کاراکتر در متلب میتوان از دستور char استفاده کرد. مثلا فرض کنید بخواهید عدد 120، را به کاراکتری با کد اسکی 120 تبدیل کنید. برای این کار کافی است بنویسید:
>> char(120)
ans = 'x'
مشاهده میکنید که کد اسکی 120، مربوط به حرف x است. نکته جالب این است که میتوانید برداری از کدهای اسکی بنویسید و سپس با کمک char آن را به جمله تبدیل کنید! فکر میکنید بردار [116 97 99 32 101 116 117 99] چه میگوید؟! ببینیم:
>> char([99 117 116 101 32 99 97 116])
ans = 'cute cat'
مشاهده کردید که برداری که گفتیم با تبدیل شدن به کاراکتر، عبارت ‘cute cat’ را در خود داشت.
string در متلب
در این بخش میخواهیم یک نکته مهم درمورد رشتهها را بررسی کنیم. معمولا در اکثر زبانهای برنامهنویسی، رشتهها با هردو علامت ‘ یا ” تعریف میشوند. حالا ما میخواهیم در متلب نیز این موضوع را بررسی کنیم. بیایید دو متغیر a و b تعریف کنیم که به ترتیب حاوی عبارت ‘Hi’ و “Hi” باشند:
>> a = 'Hi'; >> b = "Hi";
حالا بیایید با کمک class، نوع هردو متغیر را مشخص کنیم:
>> class(a)
ans = 'char'
>> class(b)
ans = 'string'
مشاهده میکنید که نوع متغیر a، مطابق انتظار char بود. اما در مورد b اینگونه نیست. متغیر b از نوع string است! چگونه چنین اتفاقی افتاد؟ چون ما در تعریف متغیر b از ” استفاده کردیم. از نسخه 2016a به بعد، در متلب با استفاده از “، میتوان رشتهها را با نوع string ذخیره کرد. یک رشته از نوع string خصوصیات جالبی دارد!
برخی از دستورهای گفته شده برای char، برای یک string نیز کارایی دارند. این دستورها عبارتند از: upper، lower، findstr، strcmp، strcmpi، length و size. ببینید:
>> size(b)
ans = 1 1
>> length(b)
ans = 1
>> upper(b)
ans = "HI"
>> findstr(b, 'H')
ans = 1
>> strcmp(b, "hi")
ans = logical 0
>> strcmpi(b, "hi")
ans = logical 1
اما بعضی از دستورهای مطرح شده منجر به نتیجه متفاوتی خواهند شد! اندیسدهی و استفاده از کولن (:)، منجر به خطا خواهد شد، زیرا برای string معنا ندارد. وقتی یک متغیر تعریف و در آن رشتهای از نوع string ذخیره میکنیم، متلب به آن رشته مثل یک عنصر نگاه میکند نه یک بردار!
>> "a" : "z"
Undefined operator ':' for input arguments of type 'string'.
>> b(2)
Index exceeds array bounds.
بعضی از دستورها هم منجر به نتایج متفاوتی خواهند شد! مثلا ما متغیر از نوع char را با یک عدد جمع کردیم و نتیجه یک عدد شد. در واقع متلب آن عدد را با کد اسکی متغیرمان جمع کرد و نتیجه را به ما داد. اما اینجا نتیجه کاملا متفاوت است و احتمالا غافلگیر خواهید شد:
>> b + 1
ans = "Hi1"
مشاهده میکنید که عدد به رشته چسبانده شد! ما میتوانیم این کار را برای عدد و رشتههای دیگر هم انجام دهیم. مثلا :
>> b + 23 + "a"
ans = "Hi23a"
مشاهده میکنید که به راحتی میتوان یک رشته از نوع string را با اعداد یا رشتههای دیگری متصل کرد. ما برای چسباندن دو رشته از نوع char از براکت استفاده میکردیم. برای string براکت چه معنایی دارد؟ ببینیم:
>> ["Hi", "Good", "Morning"]
ans = 1×3 string array "Hi" "Good" "Morning"
مشاهده میکنید که ما سه رشته از نوع string را در یک براکت کنار هم گذاشتیم و یک بردار به ما داد! به همین ترتیب میتوانید بردارها و ماتریسهای دیگری از stringها تشکیل دهید.
دریافت PDF جلسه رشته در متلب
برای دریافت pdf این جلسه، لطفا ایمیل خود را در باکس زیر وارد کرده و روی دکمه «دریافت pdf» کلیک کنید.
منابع آموزش متلب
در فهرست زیر، تعدادی از منابع خوب آموزش متلب را معرفی کردهایم. ضرورتی وجود ندارد که اینها را نگاه کنید. چون ما برای آموزش متلب، این منابع را مطالعه و استفاده کردهایم.
خب در این جلسه با متغیرهای از نوع char و string آشنا شدیم. دستورهای مربوط به این متغیرها را با هم مرور کردیم. لطفا تمرینها و مثالهایی که در هر جلسه مطرح شده است را خودتان حل کنید. مثل همیشه، سوال، پیشنهاد و انتقاد خود را با ما مطرح کنید. با هوسم همراه باشید…
مطالب زیر را حتما مطالعه کنید
تعریف متغیر در متلب
آموزش متلب رایگان
دستور max در متلب
دستور محاسبه انتگرال در متلب
دستور input در متلب
دستور ezplot در متلب
10 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام نسخه 2017 به بعد قابلیت دابل کوتیشن و داره لطفا تصحیح کنیدممنون
سلام، در بخش زیر به این مساله اشاره شده:
string در متلب
سلام بر شما و سپاس از مطالب آموزشی مفیدتان. من pdf تمام جلسات شما را دانلود کردم اما برای جلسه 13 باز نمی شود و برای جلسه 14 هم مال جلسه 22 نمایش داده می شود. سپاسگزار خواهم بود اگر این مشکل را برطرف کنید.
سلام حسین عزیز،
لینکها اصلاح شدند🙏🌹
ممنون از زحماتتون. اجرکم الله
سلام،
ممنون امیر عزیز🙏🌹
سلام چرا پی دی اف رو نمیشه دانلود کرد؟!
سلام،
بعد از وارد کردن ایمیل، باید به صورت اتوماتیک دانلود بشه. اگه مشکلتون پابرجاست به چت آنلاین پیام بدید، لینک رو براتون بفرستن.
دمتون گرم. توضیحات خوبی دادید.
فقط آخرین خط بهم ریختس. سخته خوندنش.
ممنون ابی عزیز،
چک کردم، مشکلی وجود نداشت 🌹😊