是否可以对下面的循环进行矢量化?
% 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'
答案 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秒。