関数内のシングルクウ​ォート連続3個とカン​マの意味について

3 ビュー (過去 30 日間)
しん
しん 2023 年 3 月 13 日
コメント済み: Atsushi Ueno 2023 年 3 月 16 日
cmd = ['load(''',BeforeName,''',''',strjoin(rot90(CheckList,3),''','''),''');']
上記のプログラム解釈についてご教示頂きたいです。
当該プログラムはMファイルとして実行しているプログラムの一部になります。
load関数についてのヘルプを見ると、第1引数から第3引数まではそれぞれ仕様にて定義されていましたが、第4引数以降は仕様としては存在しないと理解しました。
ですが当初自身の上記プログラムの理解としては、第1引数と第3引数、第4引数と第6引数にシングルクウォートを引数として指定しているでしたが、実際にMATLAB上でデバックすると変数cmdには「'load('BeforeName','strjoin(rot90(CheckList,3),','),');'」が格納されていました。
ですので上記プログラムの挙動としては、第1引数はBeforeNameが指定され第2引数はstrjoin(rot90(CheckList,3),',')が指定されていると考えました。
ただそうだとすると、ヘルプページに記載のload関数の仕様と実際の挙動の辻褄が合いません。
もしかすると、シングルクウォートが連続3個記載されている箇所とカンマの解釈次第で当該不整合が解消されるのではと想像しております。
ですので、関数内でシングルクウォートとカンマを使用する際の挙動についてご教示頂きたいです。
またそれが記載されているヘルプページがありましたら、そのページも併せてご教示頂けますと幸いです。
因みに現在の自身の理解では、関数内のカンマは第n引数と第n+1引数(nは1以上の自然数)を区切る以外の機能は持ち合わせていないと思っているのですが、その点につきましても認識に齟齬がありましたら併せてご教示頂けますと幸いです。
もし自身の予想が全くの検討違いだった際は、上記プログラムの正しい解釈方法をヘルプページの解説と併せてご教示頂けますと幸いです。
お手数をお掛けしてしまい大変恐縮ですが、何卒宜しくお願い致します。

回答 (1 件)

Atsushi Ueno
Atsushi Ueno 2023 年 3 月 13 日
編集済み: Atsushi Ueno 2023 年 3 月 13 日
> 第1引数から第3引数までは仕様にて定義されていましたが、第4引数以降は仕様としては存在しないと理解しました
一見、load(filename,'-mat',variables)の様に第3引数まではそれぞれ仕様にて定義されている様に見えますが、variablesは可変個数の引数として定義されているのでこの限りではありません。例えば load 関数を下記の様に使っても問題無く動作します。
load('accidents.mat','datasources','hwycols','hwydata','hwyheaders','hwyidx','hwyrows','statelabel','ushwydata','uslabel')
> 第1引数はBeforeNameが指定され第2引数はstrjoin(rot90(CheckList,3),',')が指定されていると考えました。ただそうだとすると、ヘルプページに記載のload関数の仕様と実際の挙動の辻褄が合いません。
第2引数は可変個数なので、第3引数、第4引数…と続く事が想定されます。具体的には下記の様に文字ベクトルのセル配列が入力される事が想定され、strjoin関数により「 ',' 」で区切られた可変個数の変数になります。一重引用符のエスケープシーケンスが解釈され、変数cmdに文字ベクトルとして格納されます。
BeforeName = 'sample.mat';
CheckList = {'check1','check2','check3'}; % テスト用
cmd = ['load(''',BeforeName,''',''',strjoin(rot90(CheckList,3),''','''),''');']
cmd = 'load('sample.mat','check1','check2','check3');'
> もしかすると、シングルクウォートが連続3個記載されている箇所とカンマの解釈次第で当該不整合が解消されるのではと想像しております。
そんな事はないのですが、分かり難いので二重引用符(ダブルクウォート)に変える事が推奨されます。但しこの場合、文字ベクトルはstring型に変わってしまいますので、文字ベクトルのセル配列もstring配列に変更する事になります。詳細な説明は下記リンク先に譲ります。文字と文字列 - MATLAB & Simulink - MathWorks 日本
cmd = ['load("',BeforeName,'","',strjoin(rot90(CheckList,3),'","'),'");']
cmd = 'load("sample.mat","check1","check2","check3");'
>関数内でシングルクウォートとカンマを使用する際の挙動についてご教示頂きたいです。またそれが記載されているヘルプページがありましたら、そのページも併せてご教示頂けますと幸いです。
この点は現在の使い方が正しいので問題無いかと思います。エスケープシーケンスがややこしいだけです。
>関数内のカンマは第n引数と第n+1引数(nは1以上の自然数)を区切る以外の機能は持ち合わせていない
この点も仰る通りで、間違いないと思います。
  13 件のコメント
Atsushi Ueno
Atsushi Ueno 2023 年 3 月 16 日
編集済み: Atsushi Ueno 2023 年 3 月 16 日
>load関数の先頭にある一重引用符が消えるのは変数cmdに代入されることと関係ありますでしょうか?
いいえ関係ありません。私が無意識に一重引用符を書いたり書かなかったりしていました。理解を妨げる様な描き方になってしまい申し訳ありません。下記に統一して書く様に修正した図を添付します。
  • 水色の枠外に書いた一重引用符が文字ベクトルである事を示す為に括った一重引用符です
  • 水色の枠内に描いた一重引用符は、緑色の枠内と違ってエスケープシーケンスが除かれています。本来MATLABでこのような表現方法はできません。(それが無意識に消した理由です)
  • 図の右側に文字ベクトルの連結を例として併記しました
これで下記3種類の一重引用符が混在している事が明確になったかと思います。
  • エスケープシーケンスとしての一重引用符
  • 文字そのものとしての一重引用符
  • 文字ベクトルである事を示す一重引用符
Atsushi Ueno
Atsushi Ueno 2023 年 3 月 16 日
文字ベクトルの連結については下記リンク先のドキュメントに記載されています。
角括弧を用いる文字ベクトルの連結方法は 代替機能 として取り挙げられていました。MATLABのデータ型に慣れた人はこの代替機能を使う事が多いと思いますが、新しいstring型とも共通の扱い方が可能な strcat 関数や append 関数を使った方が、万人にとって分かり易いかもしれません。

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMATLAB 入門 についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!