string型を使いこなそう – Loren’sブログから
こんにちは、道家です。在宅勤務を始めて2週間目に入りました。早く状況が治まることを願っています。
さて、今日は MathWorks ブログの中で2番目に歴史の長い Loren on the Art of MATLAB(一番歴史が長いのはどれでしょう?)からのトピックを紹介します。それがちょっと地味な string 型。
string 型はR2016bに 新しく導入された型であり、従来の char 型に比べてテキストデータの扱いが容易になりました。
2月19日の String Things の投稿では、Loren はテキストデータの比較について書いています。 char 型、 もしくは文字列の配列で良く使われる cell 配列の比較に使われるのが strcmp、 strcmpi、 strncmp、 strncmpiです。
Contents
char 配列と cell 配列
cellChars = {'Book','Bookend','Weekend','weekday'}
cellChars = 1×4 の cell 配列 {'Book'} {'Bookend'} {'Weekend'} {'weekday'}特定の文字列を比較するには strcmp を使います。
TF = strcmp('Book',cellChars)
TF = 1×4 の logical 配列 1 0 0 0先頭の文字を比較するには strncmp を使います。
TF = strncmp('Book',cellChars,4)
TF = 1×4 の logical 配列 1 1 0 0大文字、小文字を区別しない場合は strcmpi や strncmpi を使います。
TF = strncmpi('week',cellChars,4)
TF = 1×4 の logical 配列 0 0 1 1
string 配列
上記の例でも分かりますように、 char 配列はシングルクォーテーション( ' )を使って定義します。それと違って、 string 型はダブルクォーテーション( " )を使って定義します。しかも、それぞれの “単語” が一つの要素としてとらえられるので、普通に [] を使って配列を作成できます。stringArray = ["Book","Bookend","Weekend","weekday"]
stringArray = 1×4 の string 配列 "Book" "Bookend" "Weekend" "weekday"string でも char と同様 str* 関数を使うことできます。
TF = strcmp(stringArray,"Book")
TF = 1×4 の logical 配列 1 0 0 0それに加えて比較演算子も使えるようになります。
TF = stringArray ~= "Weekend"
TF = 1×4 の logical 配列 1 1 0 1更に、テキスト解析っぽい関数(個人の見解)も加わりました。例えば、完全一致には
TF = matches(stringArray,"Weekend")
TF = 1×4 の logical 配列 0 0 1 0特定の文字の並びが存在するかを確認するには contains を使います。
TF = contains(stringArray,"end")
TF = 1×4 の logical 配列 0 1 1 0他にも色々便利な関数が R2016b のタイミングで導入されました。是非確認してみてください。私のお気に入りは正規表現のライト版として extractAfter、 extractBefore、 extractBetweenなどです。
methods string
クラス string に対するメソッド: append eraseBetween join replaceBetween cellstr extractAfter le reverse char extractBefore lower sort compose extractBetween lt split contains ge matches splitlines count gt ne startsWith double insertAfter or strip endsWith insertBefore pad strlength eq ismissing plus upper erase issorted replace
ブログで良く取り上げられる string 型
実は Loren のブログでは結構 string 型の話が取り上げられています: Strings カテゴリー その中でも私のお勧めは string 型が導入された時の 紹介ブログです。あらゆる使い方について書いてあります。また、MathWorks ブログ全体で見ても string はかなり 取り上げられています。とっておきの string 機能
私のとっておきの string 機能は string 型と数値の 連結です。MATLAB Answers などでよく聞く質問ですが、連番のファイル名を作成したい、という方いませんか。例えば、 file1, file2, file3, file4, file5 というファイル名を作成したいとしましょう。まず、 char 配列だとfor id = 1:5 names1{id} = ['file' num2str(id)]; end names1
names1 = 1×5 の cell 配列 {'file1'} {'file2'} {'file3'} {'file4'} {'file5'}arrayfun を使って無理やりループを無くすみたいなこともできます。ただ、これだと何やってんのかさっぱり分かりませんね。
names2 = arrayfun(@(x) ['file' num2str(x)],1:5,'UniformOutput',false)
names2 = 1×5 の cell 配列 {'file1'} {'file2'} {'file3'} {'file4'} {'file5'}これを string を使うとこんなにすっきりになります!
names3 = "file" + (1:5)
names3 = 1×5 の string 配列 "file1" "file2" "file3" "file4" "file5"解説: + 演算子が double 型を string 型に変換し、”file” を 1×5 の配列に拡張し連結してくれる。 こうなると、こんな面白い使い方も。
prefix = ["abc"; "def"; "xyz"] names = prefix + (1:5)
prefix = 3×1 の string 配列 "abc" "def" "xyz" names = 3×5 の string 配列 "abc1" "abc2" "abc3" "abc4" "abc5" "def1" "def2" "def3" "def4" "def5" "xyz1" "xyz2" "xyz3" "xyz4" "xyz5"
おわりに
以上、Loren on the Art of MATLAB ブログからの紹介でした。この様に定期的に他の MathWorks ブログに投稿されたネタを紹介し直すこともやっていきたいので、もし興味あるブログの記事がありましたらぜひコメントを残してください。Published with MATLAB® R2019b
- Category:
- 機能と使い方
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.