Создание векторизованной переменной из соответствия регулярному выражению в MATLAB - PullRequest
0 голосов
/ 24 марта 2011

Возможно ли векторизовать цикл ниже?

% 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 ]

2 голосов
/ 24 марта 2011

Это не совсем векторизация и работает, только если вы собираетесь создать fields с нуля, а не обновлять существующую структуру, но:

fields = struct(splits{:});
1 голос
/ 24 марта 2011

Вы можете использовать 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'
0 голосов
/ 26 марта 2011

Cellfun не векторизует ваш код.Вместо этого он имеет внутренний цикл, который проходит через аргументы.

Приведенный выше код не может быть векторизован, потому что это список строк.Независимо от того, что вам придется вызывать в какой-то момент, цикл for.

На самом деле решение cellfun с вызовом cell2struct медленнее, потому что вам нужно делать вызовы извлечения между функциями.

На моей машине цикл for требует максимум 0,0008 секунд, а решение cellfun 0,0015сек в лучшем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...