20

Matlabに複数行の文字列リテラル構文がありますか、それとも複数の行を連結する必要がありますか?

逐語的なパッケージを見つけましたが、それはmファイルまたは関数でのみ機能し、エディターセル内ではインタラクティブには機能しません。

編集:私は特に、コード内のリテラルの読みやすさと変更のしやすさを求めています(さまざまなレベルのインデントされたブロックが含まれていると想像してください)-複数行の文字列を作成するのは簡単ですが、それを行うための最も便利な構文を探しています。

これまでのところ私は

t = {...
'abc'...
'def'};
t = cellfun(@(x) [x sprintf('\n')],t,'Unif',false);
t = horzcat(t{:});

これはsize(t)= 1 8を与えますが、明らかに少し混乱しています。

編集2:基本的verbatimには、エディターセルで機能しないことを除いて、私が望むことを実行しますが、おそらく私の最善の策は、機能するように更新することです。Javaインターフェイスからエディタへの現在の開いているファイルとカーソル位置を取得できるはずだと思います。問題は、同じセルに複数の逐語的な呼び出しがあった場合、それらをどのように区別するかということです。

4

3 に答える 3

13

私は行くだろう:

multiline = sprintf([ ... 
'Line 1\n'... 
'Line 2\n'... 
]);
于 2013-01-09T11:34:14.450 に答える
6

Matlabは、文字列のエスケープ処理が文字printf列リテラル構文ではなく関数ファミリーの関数であるという点で奇妙です。また、複数行のリテラルはありません。しかたがない。

私は2つのことをすることになりました。まず、処理された\rと\nをそれぞれ返すmake関数CR()LF()関数を使用して、コードで疑似リテラルとして使用できるようにします。文字列全体をsprintf()で送信するよりも、この方法を使用する方が好きです。エスケープシーケンスとして処理したくない他のバックスラッシュがある可能性があるためです(たとえば、文字列の一部が関数の引数からのものであるか、他の場所から入力を読み取った場合)。

function out = CR()
out = char(13); % # sprintf('\r')

function out = LF()
out = char(10); % # sprintf('\n');

次に、join(glue, strs)Perlのjoinまたは例のcellfun / horzcatコードのように機能する関数を作成しますが、最後の末尾の区切り文字はありません。

function out = join(glue, strs)
strs = strs(:)';
strs(2,:) = {glue};
strs = strs(:)';
strs(end) = [];
out = cat(2, strs{:});

そして、あなたのようにセルリテラルでそれを使用します。

str = join(LF, {
    'abc'
    'defghi'
    'jklm'
    });

このようなセルリテラルの「...」省略記号は必要ありません。それらを省略すると、垂直方向のベクトルが構築されます。行の長さが異なるchar文字列の場合は、それぞれがセル内でスタックしているため、問題ありません。それだけでタイピングを節約できます。

于 2013-01-10T09:22:15.327 に答える
2

古いスレッドのビットですが、私はこれを手に入れました

multiline = join([
"Line 1"
"Line 2"
], newline)

私は物事をかなり簡単にするかどうかと思いますが、明らかにそれは人が探しているものに依存します:)

于 2021-07-02T17:47:02.353 に答える