将带有数字和冒号的 matlab 字符串转换为使用冒号填充的数组

Turning a matlab string with a numbers and colon to an array populated using colon

如果我有一些字符串 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

您可以使用 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

这是一个完全避免使用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