Вы можете использовать cellstr
(что смущает, несмотря на то, что "str" предлагает string ) для преобразования строк в символьные массивы без зацикливания или cellfun
... документы указывают следующее:
C = cellstr(A)
преобразует A
в массив ячеек векторов символов . Входной массив A
может быть массивом символов, категориальным массивом или, начиная с R2016b, массивом строк.
test = {'hello', "world", 0.3; 'how', 'are', "you"}; % multi-type test cell array
ind = cellfun(@isstring, test); % indexing for string type items
test(ind) = cellstr(test(ind)) % char-ify the strings!
A cellfun
примечание к производительности для проверок класса:
В моих ответах и ответах Луиса cellfun
используется для определения того, какие элементы являются строками. Вы можете улучшить производительность cellfun
для этой задачи ...
Согласно документам cellfun
, есть некоторые опции массива символов, которые намного быстрее, чем их аналоги из дескриптора функции. Для индексации isstring
, вероятно, намного быстрее запустить первый из них:
% rapid
ind = cellfun('isclass', test, 'string');
% akin to looping
ind = cellfun(@isstring, test);
У них одинаковый вывод, в простом тесте я вижу увеличение скорости в 4 раза:
% Create large test array of random strings
c = cell(100,1000);
c = cellfun(@(x) string(char(randi([65,122],1,10))), c, 'uni', 0);
% Create functions for benchmarking
f=@()cellfun('isclass', c, 'string');
g=@()cellfun(@isstring,c);
% Timing on MATLAB R2017b
timeit( f ) % >> 0.017sec
timeit( g ) % >> 0.066sec