从MATLAB中的regexp匹配向量化变量创建

时间:2011-03-23 23:49:11

标签: matlab vectorization

是否可以对下面的循环进行矢量化?

% String to parse (we want to create variables that are defined implicitly in the string):
parseStr = 'cubeId=001000_X=10_Y=10_Z=10_minX=8590_maxX=9200_minY=8590_maxY=9200_minZ=87_maxZ=95';

% Splitting string for regexp   
matchStr = '=|_';

[start_idx, end_idx, extents, matches, tokens, names, splits] = ...
   regexp(parseStr, matchStr);   

% Inspecting the splits
>> splits
splits = 
  Columns 1 through 8
    'cubeId'    '001000'    'X'    '10'    'Y'    '10'    'Z'    '10'
  Columns 9 through 15
    'minX'    '8590'    'maxX'    '9200'    'minY'    '8590'    'maxY'
  Columns 16 through 20
    '9200'    'minZ'    '87'    'maxZ'    '95'

% Loop that we are interested in vectorizing:
for ix = 1:2:numel(splits)
   fields.(splits{ix}) = splits{ix+1};
end

% Result:
>>fields
fields = 
    cubeId: '000900'
         X: '10'
         Y: '9'
         Z: '10'
      minX: '8590'
      maxX: '9200'
      minY: '7590'
      maxY: '8610'
      minZ: '87'
      maxZ: '95'

3 个答案:

答案 0 :(得分:2)

它不是完全矢量化的,只有在你从头开始创建fields而不是更新现有结构时才有效,但是:

fields = struct(splits{:});

答案 1 :(得分:1)

您可以使用CELL2STRUCT

cell2struct(splits(2:2:end),splits(1:2:end),2)
ans = 
    cubeId: '001000'
         X: '10'
         Y: '10'
         Z: '10'
      minX: '8590'
      maxX: '9200'
      minY: '8590'
      maxY: '9200'
      minZ: '87'
      maxZ: '95'

如果您希望字段包含数字,则可以改为编写

cell2struct(cellfun(@str2double,splits(2:2:end),'uniformOutput',false),splits(1:2:end),2)

此外,您可以修改正则表达式,以便它立即返回一个结构(我没有输入整个表达式,抱歉):

regexp(parseStr,'cubeId=(?<cubeId>\d+)_X=(?<X>\d+)','names')
ans = 
    cubeId: '001000'
         X: '10'

答案 2 :(得分:0)

Cellfun不会向您的代码进行矢量化。相反,它有一个内部循环遍历参数。

上面的代码无法进行矢量化,因为它是一个字符串列表。无论你在什么时候必须调用一些for循环。

事实上,调用cell2struct的cellfun解决方案较慢,因为你需要在函数之间进行提取调用。

在我的机器上,for循环最多需要0.0008秒,而cellfun解决方案最多需要0.0015秒。