将带有数字和冒号的 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
如果我有一些字符串 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