Превращение строки matlab с числами и двоеточием в массив, заполненный двоеточием - PullRequest
0 голосов
/ 14 декабря 2018

Если у меня есть какая-нибудь строка newStr = 1 × 1 массив ячеек

{'1 25 27 45 46 62 65 70 73 76 77:83'}

Есть ли способ напрямую преобразовать это в массив?

my_array = [1 25 27 45 46 62 65 70 73 76 77:83];

, что приведет к

my_array =

 1    25    27    45    46    62    65    70    73    76    77    78    79    80    81    82    83

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вот решение, которое полностью исключает использование eval.Это не так элегантно, как один лайнер, но не подвергает вас риску eval.Если кто-то попытается внедрить вредоносный код во входную строку, худшее, что он сделает, - это ошибка, а не выполнение мошеннического кода.

В вашем примере в конце есть только одна инструкция colon assignment.Я сделал свое решение более общим, предполагая, что эти инструкции могут быть множественными и размещаться случайным образом.Так, например, я рассмотрел следующую входную строку:

a = {'1 25 27 45 46 62 65 70 73 76 77:83 99 101:105'}

Исходя из этого, запустите следующее:

%% 
fullArray    = strsplit(a{1},' ') ;         % split the string into a cell array
scalarArray  = str2double(fullArray) ;      % convert all simple scalar values
idxNotScalar = find(isnan(scalarArray)) ;   % find cells with "colon" operator

% split the arrays
colonArray  = fullArray(idxNotScalar) ;     % place colon instruction in a separate array
scalarArray(idxNotScalar) = [] ;            % clear them from the scalarArray

%% Now parse the colon instructions cells
nElem = numel(colonArray) ;
ctmp  = cell(nElem,1) ;
for k=1:nElem
    c = textscan( colonArray{k} , '%d:%d' ) ;
    ctmp{k,1} = double( c{1}:c{2} ) ;
end

%% now concatenate all results and sort
my_array = sort(cat(2,scalarArray,ctmp{:})) ;

Чтобы получить:

my_array =
     1    25    27    45    46    62    65    70    73    76    77    78    79    80    81    82    83    99   101   102   103   104   105
0 голосов
/ 14 декабря 2018

Вы можете сделать это с помощью str2num

a = {'1 25 27 45 46 62 65 70 73 76 77:83'}
my_array = str2num(a{1})

my_array =

  Columns 1 through 12

     1    25    27    45    46    62    65    70    73    76    77    78

  Columns 13 through 17

    79    80    81    82    83
...