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

3 views (last 30 days)
しん
しん on 13 Mar 2023
Commented: Atsushi Ueno on 16 Mar 2023
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以上の自然数)を区切る以外の機能は持ち合わせていないと思っているのですが、その点につきましても認識に齟齬がありましたら併せてご教示頂けますと幸いです。
もし自身の予想が全くの検討違いだった際は、上記プログラムの正しい解釈方法をヘルプページの解説と併せてご教示頂けますと幸いです。
お手数をお掛けしてしまい大変恐縮ですが、何卒宜しくお願い致します。

Answers (1)

Atsushi Ueno
Atsushi Ueno on 13 Mar 2023
Edited: Atsushi Ueno on 13 Mar 2023
> 第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 Comments
Atsushi Ueno
Atsushi Ueno on 16 Mar 2023
文字ベクトルの連結については下記リンク先のドキュメントに記載されています。
角括弧を用いる文字ベクトルの連結方法は 代替機能 として取り挙げられていました。MATLABのデータ型に慣れた人はこの代替機能を使う事が多いと思いますが、新しいstring型とも共通の扱い方が可能な strcat 関数や append 関数を使った方が、万人にとって分かり易いかもしれません。

Sign in to comment.

Products


Release

R2018b

Community Treasure Hunt

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

Start Hunting!