Подтвердить что ты не робот

Многострочный строковый литерал в Matlab?

Существует ли многострочный строковый литерал в Matlab или необходимо объединить несколько строк?

Я нашел verbatim пакет, но он работает только в m файле или функции, а не в интерактивном режиме внутри ячеек редактора.

EDIT: я особенно благодарен читаемости и легкости изменения литерала в коде (представьте, что он содержит отступы блоков разных уровней) - легко создавать многострочные строки, но я ищу наиболее удобный sytax для этого,

До сих пор у меня

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

который дает размер (t) = 1 8, но, очевидно, немного беспорядок.

РЕДАКТИРОВАТЬ 2: В основном verbatim делает то, что я хочу, за исключением того, что оно не работает в ячейках редактора, но, возможно, лучше всего обновить его, чтобы он это сделал. Я думаю, что должно быть возможно получить текущий открытый файл и позицию курсора из java-интерфейса в редактор. Проблема заключалась бы в том, что в одной и той же ячейке было бы несколько дословных вызовов, как бы вы различали их.

4b9b3361

Ответ 1

Matlab - это странность в том, что обработка побега в строках является функцией семейства функций printf вместо синтаксиса строкового литерала. И нет многострочных литералов. О, хорошо.

Я закончил делать две вещи. Сначала создайте функции CR() и LF(), которые возвращают обработанные \r и\n соответственно, поэтому вы можете использовать их как псевдо-литералы в своем коде. Я предпочитаю делать это, а не отправлять целые строки через sprintf(), потому что там могут быть другие обратные косые черты, которые вы не хотели бы обрабатывать как escape-последовательности (например, если некоторые из ваших строк были получены из аргументов функции или ввода, читаемых из других источников).

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

Я бы пошел за:

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