?講解視頻:可以在bilibili搜索《MATLAB教程新手入門篇——數(shù)學(xué)建模清風(fēng)主講》。?
MATLAB教程新手入門篇(數(shù)學(xué)建模清風(fēng)主講,適合零基礎(chǔ)同學(xué)觀看)_嗶哩嗶哩_bilibili
在文本數(shù)據(jù)預(yù)處理階段,我們通常需要對字符串?dāng)?shù)組進(jìn)行基本的操作。我們將從字符串?dāng)?shù)組的引用開始,逐步探索它們的修改和刪除方法。緊接著,我們將學(xué)習(xí)如何有效地拼接和重構(gòu)字符串?dāng)?shù)組,以便它們能夠適應(yīng)更加復(fù)雜的數(shù)據(jù)處理需求。
(1)引用字符串?dāng)?shù)組
在MATLAB中,有兩種方式引用字符串?dāng)?shù)組:使用小括號()和使用大括號{}引用。這兩種引用方式和元胞數(shù)組的引用方式非常相似,下面我們來看例子:
使用小括號()引用返回的是字符串類型:引用單個(gè)位置的元素返回的是一個(gè)字符串標(biāo)量;引用多個(gè)位置的元素返回的是一個(gè)字符串?dāng)?shù)組。具體引用方式類似于數(shù)值數(shù)組:
使用大括號{}引用返回的是字符向量類型:返回的結(jié)果類似于對字符向量元胞數(shù)組使用大括號進(jìn)行引用。(拓展:你也可以使用char函數(shù)將字符串類型轉(zhuǎn)換為字符數(shù)組類型)
當(dāng)然,我們也可以使用鏈?zhǔn)剿饕?。和元胞?shù)組的引用類似,使用鏈?zhǔn)剿饕龝r(shí)如果用到了小括號(),那它需要被放置在索引表達(dá)式的末尾。
拓展:如何反轉(zhuǎn)字符串中的字符順序?
對于字符向量,反轉(zhuǎn)字符順序非常容易:
然而,上述這些方法對字符串都失效了:
為什么MATLAB會返回和s2相同的結(jié)果呢?這是因?yàn)閟2是一個(gè)字符串標(biāo)量,它是一個(gè)整體。如果是一個(gè)字符串向量,則會顛倒向量中各字符串元素的位置:
因此,使用end:-1:1進(jìn)行索引,只會將字符串?dāng)?shù)組中的元素順序進(jìn)行反轉(zhuǎn)。要想對字符串中的字符順序進(jìn)行反轉(zhuǎn),有以下兩種解決方法:
(1)先將字符串轉(zhuǎn)換為字符向量,然后再進(jìn)行反轉(zhuǎn):
這樣得到的結(jié)果是一個(gè)字符向量類型,如果你希望結(jié)果也是字符串類型,你可以套用一個(gè)string函數(shù):
上面的s2是一個(gè)字符串標(biāo)量,如果我們想對一個(gè)字符串?dāng)?shù)組中的所有字符串標(biāo)量分別進(jìn)行反轉(zhuǎn),應(yīng)該如何操作呢?此時(shí)我們可以考慮使用循環(huán)語句。
首先,我們使用strings函數(shù)初始化一個(gè)和s3相同大小的空的字符串?dāng)?shù)組ss,用來保存結(jié)果。在循環(huán)體內(nèi),我們使用大括號{}依次取出s3中的每個(gè)元素,將其反轉(zhuǎn)后再轉(zhuǎn)換回字符串類型。注意:代碼中對ss的第ii個(gè)位置元素進(jìn)行了修改,后文還會詳細(xì)介紹字符串?dāng)?shù)組的修改。顯然,這種方法寫起來很麻煩也不容易理解,因此下面我們介紹一種更好用的方法。
(2)使用reverse函數(shù)
reverse函數(shù)在2016b版本中推出,它能反轉(zhuǎn)文本中的字符順序。它支持字符向量、字符向量元胞數(shù)組以及字符串?dāng)?shù)組類型:
(2)修改和刪除字符串?dāng)?shù)組
在MATLAB中,字符串?dāng)?shù)組的修改和刪除操作與元胞數(shù)組類似,支持小括號()和大括號{}兩種不同的方式。
修改操作:
使用小括號()修改字符串?dāng)?shù)組時(shí),等號右側(cè)的值可以是字符串、字符向量或字符向量元胞數(shù)組,只要大小兼容即可。這種修改方式的靈活性使得修改字符串?dāng)?shù)組成為一項(xiàng)簡單且直觀的任務(wù)。
然而,當(dāng)使用大括號{}對字符串?dāng)?shù)組的元素進(jìn)行修改時(shí),等號右側(cè)的值只能是字符向量。
因此,在實(shí)際操作中,使用小括號()進(jìn)行字符串?dāng)?shù)組的修改是更為常見和方便的做法。
刪除操作:
要?jiǎng)h除字符串?dāng)?shù)組中的元素,可以將等號右側(cè)改為空向量[]。
使用小括號()進(jìn)行刪除操作時(shí)會改變數(shù)組中元素的數(shù)量;使用大括號{}則不會改變數(shù)組中元素的數(shù)量,被刪除的位置元素會被缺失字符串代替。
拓展:缺失字符串<missing>在MATLAB字符串?dāng)?shù)組中的功能類似于數(shù)值數(shù)組中的NaN,它標(biāo)示著某個(gè)位置的字符串值是缺失的。這種機(jī)制在處理包含不完整數(shù)據(jù)的字符串?dāng)?shù)組時(shí)非常有用。后續(xù)章節(jié)我們會專門講解MATLAB的數(shù)據(jù)分析,到時(shí)候會介紹缺失值的處理方法。
拓展:使用加號(+)連接字符串?dāng)?shù)組
在 MATLAB 中,我們可以使用加號(+)對字符串?dāng)?shù)組進(jìn)行操作。這種方法類似于數(shù)值數(shù)組的加法運(yùn)算,但在字符串?dāng)?shù)組中,它被用于連接字符串元素。以下是一些示例,展示了如何在不同情況下使用加號(+)連接字符串?dāng)?shù)組:
從上面的例子可以看出,對字符串?dāng)?shù)組使用加法運(yùn)算非常方便,也非常靈活。下面我們來看一道綜合性較強(qiáng)的例子:隨機(jī)生成新生兒的姓名。
變量s1和s2如下所示,它們分別表示姓氏和名字,請將姓氏和名稱兩兩組合,生成所有可能的姓名,然后從中隨機(jī)抽取10個(gè)互不相同的姓名保存到一個(gè)字符串向量中。
思路:首先要從s1和s2中分別提取姓氏和名字,并將提取的結(jié)果分別保存到兩個(gè)字符串向量中;如果提取后的一個(gè)字符串向量為行向量、另一個(gè)字符串向量為列向量,那么就可以利用字符串加法運(yùn)算的兼容模式得到所有組合后的姓名;最后我們可以借助第三章課后習(xí)題中介紹的randperm函數(shù)從所有可能的姓名中隨機(jī)抽取10個(gè)互不相同的姓名。
代碼如下:
% s1和s2同上
s1 = s1{:}(isletter(s1)); % 借助isletter函數(shù)生成邏輯索引(這里用到了鏈?zhǔn)剿饕?% '王李張劉陳楊黃周胡趙'
s1 = string(s1'); % 將上一步得到的s1轉(zhuǎn)置后,再轉(zhuǎn)換為字符串類型
% s1: 10×1 string 數(shù)組 [ "王"; "李"; ... "胡"; "趙"]
s2 = strsplit(s2,'、'); % 使用strsplit函數(shù)對s2進(jìn)行拆分,得到一個(gè)行字符串向量
% s1: 1×12 string 數(shù)組 [ "辰" "瑞" ... "浩然" "奕澤"]
name = s1 + s2 % 利用加法的兼容性得到所有的名字
% name: 10×12 string 數(shù)組
ind = randperm(numel(name),10); % 從1-numel(name)的序列中隨機(jī)抽取10個(gè)作為索引
name10 = name(ind) % 使用ind索引從name中抽取10個(gè)姓名(ind實(shí)際上是線性索引)
(3)字符串?dāng)?shù)組的拼接、重構(gòu)、重復(fù)和排序
下面我們來介紹如何對字符串?dāng)?shù)組進(jìn)行拼接、重構(gòu)、重復(fù)以及排序操作。這些操作對于數(shù)據(jù)預(yù)處理、文本分析和其他需要靈活處理字符串的場景至關(guān)重要。
拼接操作:
字符串?dāng)?shù)組的拼接方式和數(shù)值數(shù)組非常相似,我們既可以使用中括號[]進(jìn)行拼接,還可以借助cat、horzcat和vertcat函數(shù)進(jìn)行拼接。另外,拼接的文本類型除了字符串之外,也支持字符向量、字符向量元胞數(shù)組、數(shù)值數(shù)組等,MATLAB會自動(dòng)將它們轉(zhuǎn)換成字符串類型,這一操作類似于我們前面介紹的混合創(chuàng)建字符串?dāng)?shù)組。
重構(gòu)操作:
重構(gòu)操作(又稱重塑操作)是指更改數(shù)組的形狀或維度,同時(shí)保留其數(shù)據(jù)內(nèi)容。我們可以使用reshape函數(shù)對字符串?dāng)?shù)組進(jìn)行重構(gòu)操作。它的用法非常簡單,我們來看一個(gè)例子:
重復(fù)操作:
在第三章矩陣操作中,我們介紹過repmat函數(shù)和repelem函數(shù),它們分別用于對數(shù)組整體進(jìn)行堆疊和對數(shù)組中的元素進(jìn)行重復(fù)。這兩個(gè)函數(shù)也適用于字符串?dāng)?shù)組,我們來看例子:
排序操作:
第三章中我們介紹過兩個(gè)排序函數(shù),分別是sort函數(shù)和sortrows函數(shù)。其中,sort函數(shù)通常用于對向量進(jìn)行排序,sortrows函數(shù)則基于矩陣的某一列對矩陣進(jìn)行排序,排序后得到的新矩陣的同一行元素不會改變。
這兩個(gè)函數(shù)也適用于字符串?dāng)?shù)組。以升序排列為例,字符串在排序時(shí)是逐字符進(jìn)行比較的,對于每一對比較的字符,它們的Unicode編碼被用來確定排序順序,Unicode編碼較小的字符會被排在前面。如果一個(gè)較短的字符串的所有字符和另一個(gè)更長的字符串的前面字符完全相同,那么這個(gè)較短的字符串排在前面。
下面來看例子:
排序結(jié)果 sort_s 是基于每個(gè)字符串元素的 Unicode 字符編碼進(jìn)行排序的。具體解釋如下:
- " z" 排在最前面,因?yàn)樗钥崭褡址_始,而空格的 Unicode 編碼小于任何字母或數(shù)字的編碼。
- "123" 排在 " z" 之后,因?yàn)閿?shù)字的 Unicode 編碼小于字母的編碼。
- 接下來是 "A" 和 "Bc",由于大寫字母的 Unicode 編碼小于小寫字母,它們排在小寫字母前。
- "aa", "ab", "abc", "ac", "ba", "bad"都是小寫字母開始的字符串,且按照字母的 Unicode 編碼順序排列。
索引數(shù)組 ind 中的每個(gè)值表示排序后的數(shù)組sort_s中對應(yīng)位置的元素在原始數(shù)組 s 中的位置。例如,ind(1) = 4 意味著sort_s中第一個(gè)元素 " z" 是原始數(shù)組 s 中的第4個(gè)元素;同樣,ind(2) = 6 表示sort_s中的第二個(gè)元素 "123" 是原始數(shù)組 s 中的第6個(gè)元素;依次類推。
另外,我們也可以對字符串?dāng)?shù)組使用sortrows函數(shù)。
下面來看一個(gè)例子,這個(gè)例子中的字符串?dāng)?shù)組s是我們隨機(jī)生成的,它有4行3列,數(shù)組中的每個(gè)元素都是在字符集 ?'a', ?'b', ?'c', ?'d' ?中隨機(jī)抽取兩個(gè)拼接而成的字符串標(biāo)量。
文章來源:http://www.zghlxwxcb.cn/news/detail-795543.html
??點(diǎn)擊下方的CSDN專欄閱讀下一篇文章:
MATLAB入門課程專欄文章來源地址http://www.zghlxwxcb.cn/news/detail-795543.html
到了這里,關(guān)于第5章:5.4.2 字符串?dāng)?shù)組的基本操作(MATLAB入門課程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!