کار با رشته در متلب به نسبت بسیاری از زبانهای برنامه نویسی کار دشواری نیست. در این قسمت از دوره آموزش متلب فنولوژی در مورد رشته در متلب و انواع توابع مفید در کار با رشته در متلب صحبت میکنیم. با ما همراه باشید.
ساخت رشته در متلب
ساخت رشتهای از کاراکترها در متلب کار به نسبت سادهای است. تا اینجای آموزش نیز زیاد از آن استفاده کردهایم. برای مثال عبارت زیر را در بخش command prompt تایپ کنید:
1 |
my_string = 'Tutorials Point' |
متلب با اجرای کد بالا نتیجه زیر را نمایش میدهد:
1 |
my_string = Tutorials Point |
به بخشهای انواع متغییر در متلب و انواع دیتاتایپ در متلب توجه کنید. متلب همهی متغییرها را به صورت آرایه در متلب به شمار میآورد. رشته در متلب نیز به عنوان آرایهای از کاراکترها در متلب در نظر گرفته میشود. میتوان از دستور whos برای بررسی متغییری که در بالا ایجاد شد استفاده کرد. این دستور را در کامند پرامپت تایپ کنید و نتیجه به صورت زیر خواهد شد:
1 2 |
Name Size Bytes Class Attributes my_string 1x16 32 char |
کاربرد توابع عددی در مدیریت رشتهها
جالب بدانید میتوان از توابع تبدیل اعداد در متلب (مانند uint8 یا uint16) برای تبدیل کاراکترهای یک آرایه به کدهای عددی آنها استفاده کرد. سپس تابع char، بردار عددی را به کاراکترها برمیگرداند. به مثال زیر توجه کنید:
1 2 3 4 5 6 7 |
my_string = 'Tutorial''s Point'; str_ascii = uint8(my_string) % مقدار اسکی هشت بیتی str_back_to_char= char(str_ascii) str_16bit = uint16(my_string) % مقدار اسکی شانزده بیتی str_back_to_char = char(str_16bit) |
نتایج به صورت زیر به نمایش در میآید. ابتدا رشته را به مقادیر اسکی ۸ بیتی و سپس ۱۶ بیتی تقسیم کرده و مجددا آنها را به رشته برگرداندیم.
1 2 3 4 5 6 7 8 9 10 11 |
str_ascii = 84 117 116 111 114 105 97 108 39 115 32 80 111 105 110 116 str_back_to_char = Tutorial's Point str_16bit = 84 117 116 111 114 105 97 108 39 115 32 80 111 105 110 116 str_back_to_char = Tutorial's Point |
آرایهای مستطیلی از کاراکترها
آرایههایی که تا اینجا معرفی کردیم، آرایههای یک بعدی از کاراکترها بودند؛ با اینکه نیاز داریم دیتاهای بیشتر از آن نیز ذخیره کنیم (دادههای متنی با ابعاد بالاتر). این کار با استفاده از آرایههای مستطیلی از کاراکترها انجام میشود. آسانترین راه ساخت آرایهی مستطیلی از کاراکترها، ترکیب کردن دو یا چند آرایهی یک بعدی از کاراکترهاست (چه به صورت عمودی و چه افقی)
ترکیب عمودی رشته در متلب
میتوانید از دو روش زیر برای ترکیب عمودی رشته در متلب استفاده کنید:
- استفاده از عملگر ترکیب در متلب ([]) که هر سطر با علامت سمی کالن (;) جدا میشود. در این روش باید تعداد کاراکترهای همهی سطرها برابر باشد (اگر برابر نبود باید از فاصله استفاده کرد تا برابر شوند).
- استفاده از تابع char. در این روش برای جداسازی سطرها از علامت (,) استفاده میشود. اگر طول رشتهها برابر نباشد خود تابع با فاصله گذاری مشکل را حل میکند. به مثال زیر توجه کنید:
1 2 3 4 5 6 |
doc_profile = ['Zara Ali '; 'Sr. Surgeon '; 'R N Tagore Cardiology Research Center'] doc_profile = char('Zara Ali', 'Sr. Surgeon', ... 'RN Tagore Cardiology Research Center') |
1 2 3 4 5 6 7 8 9 |
doc_profile = Zara Ali Sr. Surgeon R N Tagore Cardiology Research Center doc_profile = Zara Ali Sr. Surgeon RN Tagore Cardiology Research Center |
ترکیب افقی رشته در متلب
برای ترکیب افقی رشته در متلب میتوانید از یکی از دو روش زیر استفاده کنید:
- استفاده از عملگر ترکیب در متلب ([]) که برای جداسازی ستونها میتوان از فاصله یا کاراکتر کاما (‘,’) استفاده کرد. این روش فاصلههای انتهایی را نگه میدارد.
- استفاده از تابع ترکیب رشته در متلب (stract). این روش فاصلههای انتهایی عبارات را حذف میکند.
به مثال زیر توجه کنید:
1 2 3 4 5 6 |
name = 'Zara Ali '; position = 'Sr. Surgeon '; worksAt = 'R N Tagore Cardiology Research Center'; profile = [name ', ' position ', ' worksAt] profile = strcat(name, ', ', position, ', ', worksAt) |
مشاهده نتایج:
1 2 3 |
profile = Zara Ali , Sr. Surgeon , R N Tagore Cardiology Research Center profile = Zara Ali,Sr. Surgeon,R N Tagore Cardiology Research Center |
تبدیل رشتهها به آرایهی سلولی
همانطور که بررسی کردیم، ترکیب چند رشته با طولهای متفاوت (تعداد کاراکترهای نابرابر) میتواند مشکل ساز باشد. در روشهای قبل برای رفع این مشکل از فاصلههای انتهایی استفاده کردیم. با این وجود یک روش بهینهتر نیز برای این منظور وجود دارد که استفاده از آرایههای سلولی است. آرایههای سلولی میتوانند دیتاهایی با سایز و انواع مختلف در خود ذخیره کنند.
تابع cellstr یک آرایهای از کاراکترها را به آرایهی سلولی از رشته در متلب تبدیل میکند. به مثال زیر توجه کنید:
1 2 3 4 5 6 7 |
name = 'Zara Ali '; position = 'Sr. Surgeon '; worksAt = 'R N Tagore Cardiology Research Center'; profile = char(name, position, worksAt); profile = cellstr(profile); disp(profile) |
مشاهده نتایج:
1 2 3 4 5 |
{ [1,1] = Zara Ali [2,1] = Sr. Surgeon [3,1] = R N Tagore Cardiology Research Center } |
انواع توابع رشته در متلب
متلب شامل تعداد زیادی تابع برای ایجاد، ترکیب، تجزیه، مقایسه و تغییر دادن رشتهها است. در ادامه به چند مورد از توابع مهم در متلب اشاره میکنیم:
توابع مربوط به آرایههای کاراکتری
- blanks : ایجاد رشتهای از کاراکترهای خالی
- cellstr : ایجاد آرایهی سلولی از رشتهها از یک آرایهی کاراکتری
- char : تبدیل به آرایهای از کاراکترها (رشته)
- iscellstr : بررسی میکند آیا ورودی آرایهی سلولی از رشته است یا خیر.
- ischar : بررسی میکند ورودی آرایهای از کاراکتر است یا خیر.
- sprintf : فرمت دادهها را به رشته تبدیل میکند. (مثلا تبدیل اعداد واقعی به اعداد متنی)
- strcat : ترکیب رشتهها به صورت افقی
- strjoin : ترکیب رشتههای داخل آرایهی سلولی، به یک رشتهی واحد
توابع شناسایی بخشی از رشتهها (زیررشتهها)
- isletter : بررسی میکند ورودی جزو حروف الفبا باشد.
- isspace : بررسی میکند ورودی کاراکتر فاصله (space) باشد.
- isstrprop : بررسی میکند رشته جزو یک کتگوری خاص (حروف الفبا، اعداد و …) باشد.
- sscanf : خواندن دادهی فرمت شده از یک رشته (مثلا تبدیل اعداد متنی به اعداد واقعی)
- strfind : یافتن یک رشته در رشتهای دیگر
- strrep : یافتن و جایگزینی یه زیررشته در یک رشته دیگر
- strsplit : جداسازی رشته در یک بازه مشخص
- strtok : رشته را توکنبندی میکند (به بخشهای مشخص تقسیم میکند).
- validatestring : بررسی اعتبار رشتهی متنی (مثلا آیا یک کلمه یا مشابه آن در یک رشته وجود دارد یا خیر)
- symvar: تشخیص متغییرهای سمبولیک در یک عبارت
- regexp : تطبیق عبارات منظم در یک متن (حساس به حروف کوچک و بزرگ)
- regexpi : تطبیق عبارات منظم در یک متن (غیرحساس به حروف کوچک و بزرگ)
- regexpprep : جایگزینی رشته با استفاده از عبارات منظم در متن
- regexptranslate : ترجمهی رشته به یک عبارت منظم در متن (عبارت منظم توسط شما به ورودی داده میشود مثلا میتوانید بگویید کلماتی که با حرف c شروع شوند و به حرف d ختم شوند.)
توابع مقایسه رشته در متلب
- strcmp : مقایسه دو رشته (حساس به حروف کوچک و بزرگ)
- strcmpi : مقایسه دو رشته (غیرحساس به حروف کوچک و بزرگ)
- strncmp : مقایسه n کاراکتر اول دو رشته (حساس به حروف کوچک و بزرگ)
- strncmpi : مقایسه n کاراکتر اول دو رشته (غیرحساس به حروف کوچک و بزرگ)
توابع تغییر دادن رشتهها
- deblank : حذف فضای خالی انتهای رشته
- strtrim : حذف فضای خالی از ابتدا و انتهای رشتهها
- lower : تبدیل رشتهها به حروف کوچک
- upper : تبدیل رشتهها به حروف بزرگ
- strjust : جاستیفای کردن (تنظیم فاصله گذاری) آرایهی کاراکترها
مثالهایی از توابع رشتهها
در ادامه به بررسی چند مثال کاربردی از توابع مذکور میپردازیم.
فرمت رشتهها در متلب
در این مثال یک آرایهی عددی یک در پنج داریم که آن را با تغییرات گوناگون در یک رشته پرینت میکنیم.
1 2 |
A = pi*1000*ones(1,5); sprintf(' %f \n %.2f \n %+.2f \n %12.2f \n %012.2f \n', A) |
1 2 3 4 5 |
ans = 3141.592654 3141.59 +3141.59 3141.59 000003141.59 |
متصل کردن رشتهها
به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 |
%آرایهی سلولی از رشتهها str_array = {'red','blue','green', 'yellow', 'orange'}; % متصل کردن رشتهها به یکدیگر با علامتهای متفاوت str1 = strjoin(str_array, "-") str2 = strjoin(str_array, ",") |
1 2 |
str1 = red-blue-green-yellow-orange str2 = red,blue,green,yellow,orange |
یافتن و جایگزینی رشتهها
یک فایل اسکریپت مانند زیر ایجاد کنید:
1 2 3 4 5 6 7 8 9 10 11 |
students = {'Zara Ali', 'Neha Bhatnagar', ... 'Monica Malik', 'Madhu Gautam', ... 'Madhu Sharma', 'Bhawna Sharma',... 'Nuha Ali', 'Reva Dutta', ... 'Sunaina Ali', 'Sofia Kabir'}; new_student = strrep(students(8), 'Reva', 'Poulomi') % نمایش نامها (بدون نام خانوادگی) first_names = strtok(students) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
new_student = { [1,1] = Poulomi Dutta } first_names = { [1,1] = Zara [1,2] = Neha [1,3] = Monica [1,4] = Madhu [1,5] = Madhu [1,6] = Bhawna [1,7] = Nuha [1,8] = Reva [1,9] = Sunaina [1,10] = Sofia } |
مقایسه رشتهها در متلب
یک فایل اسکریپت مانند زیر ایجاد کنید:
1 2 3 4 5 6 7 8 |
str1 = 'This is test' str2 = 'This is text' if (strcmp(str1, str2)) sprintf('%s and %s are equal', str1, str2) else sprintf('%s and %s are not equal', str1, str2) end |
1 2 3 |
str1 = This is test str2 = This is text ans = This is test and This is text are not equal |