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



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

最新更新