2013-01-09 24 views
17

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

verbatimパッケージが見つかりましたが、mファイルまたは関数でのみ動作し、エディタセル内では対話的に動作しません。

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

は、これまでのところ私は

大きさ(T)を与える
t = {... 
'abc'... 
'def'}; 
t = cellfun(@(x) [x sprintf('\n')],t,'Unif',false); 
t = horzcat(t{:}); 

= 1~8を有するが、明らかに混乱のビットです。

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

+0

私はあなたの質問に従っているかどうかわかりません。あなたの目標を明確にするいくつかの例を追加できますか? – Shai

+2

Shai:Pythonで '' "' ''のような複数の文字列リテラルを入力したいと思います。例えば、インデントを保持しているテキストブロックをコピーして別のソースからmatlab文字列に貼り付けようとしています – robince

答えて

6

MATLABは、文字列内のそのエスケープ処理で変わり者では、代わりに文字列リテラル構文の機能のprintf家族の関数です。そして、複数のリテラルはありません。しかたがない。

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

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

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

第二に、Perlのように動作しますjoin(glue, strs)機能を作る参加したり、関数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文字列の長さが異なる場合は、セル内にスタックされているため、行の長さが違うと問題ありません。それだけで、いくつかの入力を省くことができます。

+2

私はMatlab r2007bとcat(1、strs {:})という行を使用しています。期待どおりに処理されていない、私は "CATの引数の次元は一貫していません。"これは私の古いMatlabバージョンに起因するものでしょうか? – RobertG

+0

私にとっては、関数呼び出しchar(1、strs {:})を使用しています。代わりに動作するようです。 – RobertG

+0

@RobertG:そうです、それは 'cat(2、strs {:})'や 'horzcat(strs {:})'でなければなりません。愚かな監督;ごめんなさい。一定。 'char(1、strs {:})'を呼び出すと、改行が埋め込まれた1つの長いcharベクタの代わりに、埋め込まれた2-D char配列が生成されるでしょう。これは便利かもしれませんが、 () 'を返します。 ( 'cat(1、...)'はすべての入力文字列がOPのように同じ長さであるが出力が間違った形式であれば動作するように見えます) –

12

私は行くだろう:

multiline = sprintf([ ... 
'Line 1\n'... 
'Line 2\n'... 
]); 
+1

手動で改行を追加するには同じ考えをしていますが...両方ともリテラルブロックのコピーと貼り付けに苦労します! – robince

+0

正規表現で検索/置換できるエディタを手に入れ、\ nで置き換えてください\\ n \ '... \ n \' –

+1

http://undocumentedmatlab.com/blog/editormacro-assign-a-keyboard-macro-in-the-matlab-editor/を使用して、テキストをエディタにプログラムに特別に貼り付けることができます必要な置換を行う。s –

関連する問題