Как в MATLAB вставить строку в начале каждой строки в массиве ячеек?

У меня есть массив ячеек числовых строк, например:

labels = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'}

Я пытаюсь добавить строку ('Label ') в начало каждого элемента массива без использования какого-либо цикла, так как массив огромен, и мне нужно, чтобы код выполнялся быстро. Еще одним моим требованием является сохранение пробела после слова 'Label', когда я применяю его к двузначным элементам массива. Результат, который я хочу:

fullLabels = {'Label 1', 'Label 2', 'Label 3', 'Label 4', 'Label 5',
              'Label 6', 'Label 7', 'Label 8', 'Label 9', 'Label 10',
              'Label 11', 'Label 12'}

Я попытался использовать strcat() следующим образом:

fullLabels = strcat('Label ', labels);

Это нормально для однозначных элементов массива, но когда он применяется к двузначным элементам массива, пробел после 'Label' удаляется, чтобы дать:

fullLabels = {..., 'Label10', 'Label11', 'Label12'}

person humbleHacker    schedule 23.06.2016    source источник


Ответы (2)


strcat обрезает конечные пробелы из всех входных данных перед конкатенацией. Вы захотите вручную объединить строки, используя [].

fullLabels = cellfun(@(x)['Label ', x], labels, 'UniformOutput', false)

%   'Label 1'
%   'Label 2'
%   'Label 3'
%   'Label 4'
%   'Label 5'
%   'Label 6'
%   'Label 7'
%   'Label 8'
%   'Label 9'
%   'Label 10'
%   'Label 11'
%   'Label 12'

Вы также можете использовать что-то вроде regexprep для добавления метки. Это заменяет первый символ каждой метки на себя (\1) с добавлением 'Label ' впереди.

fullLabels = regexprep(labels, '^.', 'Label \1')

Обновить

В ответе @Dev-iL упоминается использование массива ячеек для передачи пробела в strcat, о котором я не знал. Вместо объединения пробелов мы могли бы просто вставить 'Label ' внутри ячейки.

strcat({'Label '}, labels)
person Suever    schedule 23.06.2016
comment
Идеальный! Спасибо @Suever. Я попробую оба с моими данными и пойду с самым быстрым. Я подозреваю, что разница во времени все равно будет незначительной. - person humbleHacker; 23.06.2016

Поскольку strcat удаляет только завершающие пробелы, если вам удастся заставить свои числовые строки начинаться с пробела (используя настройки того, что преобразует их из "правильных чисел"), вы не увидите этой проблемы:

labels = {' 1', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8', ' 9', ' 10', ' 11', ' 12'};
fullLabels = strcat('Label',labels);

В качестве альтернативы, как упоминалось здесь, вы можете "обмануть" strcat, окружив пробел с клеткой:

fullLabels = strcat('Label', {' '}, labels);
person Dev-iL    schedule 24.06.2016
comment
Я бы сказал, что первая часть этого ответа на самом деле не завершена, поскольку она не предлагает способ расставить пробелы. Но я думаю, что второй вариант является наиболее читаемым решением. - person Dennis Jaheruddin; 24.06.2016
comment
@DennisJaheruddin - о первом решении: существуют различные способы преобразования вектора чисел в массив ячеек строк, имеющих любой формат, который вам нужен (в основном sprintf и num2str), но, поскольку это не является предметом вопроса, я только указал это как возможность (конечно, для использования, когда это применимо). - person Dev-iL; 24.06.2016
comment
@ Dev-iL Не знал, что ты можешь это сделать (+1). Опираясь на это, я опубликовал обновление своего ответа, в котором просто используется {'Label '} в качестве первого ввода. Умный. - person Suever; 24.06.2016