2013-01-09 278 views
17

在Matlab中是否存在多行字符串文字语法或是否需要连接多行?Matlab中的多行字符串文字?

我发现了verbatim软件包,但它只能在m文件或函数中使用,并且不能在编辑器单元格中以交互方式工作。

编辑:我特别是在可修改性和易于修改代码中的文字(想象它包含不同级别的缩进块) - 很容易做出多行字符串,但我正在寻找最方便的联合那。

到目前为止,我有

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

其给出大小(T)= 1 8,但显然有点乱。

编辑2:基本上verbatim做我想要的,除非它不在编辑器单元格中工作,但也许我最好的选择是更新它,所以它。我认为应该可以从java界面获得当前打开的文件和光标位置到编辑器。问题是如果在同一个单元格中有多个逐字调用,你将如何区分它们。

+0

我不知道我按照你的问题。你能否添加一些能够澄清你的目标的例子? – Shai

+2

Shai:我想在Python中输入像“”“”'这样的多行字符串:例如,从另一个源文件复制并粘贴一段文本(保留缩进)到一个matlab字符串。 – robince

回答

6

Matlab是在字符串转义处理一个古怪是printf家庭的功能,而不是字符串文字语法的功能。没有多行文字。好吧。

我最终做了两件事。首先,使CR()LF()函数分别返回\ r和\ n,因此您可以在代码中将它们用作伪文字。我更喜欢这样做,而不是通过sprintf()发送整个字符串,因为在那里你可能还有其他反斜杠不想作为转义序列处理(例如,如果你的某些字符串来自函数参数或从别处读取输入)。

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

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

其次,做一个join(glue, strs)功能工作方式类似于Perl的加入或在您的示例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 {:})'可能会产生一个填充二维字符数组,而不是一个带有嵌入换行符的长字符向量,这可能也很有用,但这不是我'join ()'。 (如果所有输入字符串的长度与OP的长度相同,则'cat(1,...)'将显示工作,但输出格式错误。) –

12

我会去:

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

我想它会交易单元格数组messing手动添加换行符,但几乎相同的想法...都复制和粘贴一个文字块有点痛! – robince

+0

获取一个编辑器,可以搜索/用正则表达式替换,然后\ n替换\ n \ '... \ n \' –

+1

您可以使用http://undocumentedmatlab.com/blog/editormacro-assign-a-keyboard-macro-in-the-matlab-editor/以编程方式将文本特殊粘贴到编辑器中,做必要的替代。s –