0

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

% 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'
4

3 回答 3

2

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

fields = struct(splits{:});
于 2011-03-23T23:53:21.737 回答
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'
于 2011-03-23T23:52:42.370 回答
0

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

上面的代码不能向量化,因为它是一个字符串列表。无论您在某些时候都必须调用一些 for 循环。

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

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

于 2011-03-26T02:47:38.683 回答