Matlab重命名struct array的元素

时间:2017-03-22 09:30:56

标签: arrays matlab struct

我有一个结构数组,Links如下:

==================
src   dest    type
==================
dev_1  sw_1    S
d_2  sw_3    S
ev_4  sw_2    S
DND    sw_1    Y
sw_3    DND    Y
sw_1    dev_1  S
sw_2    ev_4  S
sw_2    sw_1   D
...

编辑:

我需要通过将DNDsw_*元素以外的所有元素替换为RBR来更改上面的struct数组,同时保留DNDsw_*字段,那就是:

==================
src   dest    type  
==================
RBR    sw_1    S
RBR    sw_3    S
RBR    sw_2    S
DND    sw_1    Y
sw_3    DND    Y
sw_1    RBR  S
sw_2    RBR S
sw_2    sw_1   D
...

我想知道实现这一目标的最快方法。我的想法是做以下事情:

idxC_src = strfind({links.src}, 'SW')
% filter our the fields having SW
idxE_src = find((cellfun('isempty', idxC)))
% do the same for links.dest as well.

但是可能有一种更简单的方法。

1 个答案:

答案 0 :(得分:2)

您可以使用regexprep更新字符串的单元格数组:

FROM

对于示例结构:

% Generate sample data
Links = struct('src',{'dev_1', 'dev_2', 'dev_4', 'DND', 'sw_2', 'sw_2'}, ...
               'dest',{'sw_2', 'sw_2', 'DND', 'dev_1', 'dev_2', 'dev_4'}, ...
               'type', {'S', 'S', 'S', 'Y', 'S', 'D'} ...
               );


fieldstoupdate = {'src', 'dest'};
for ii = 1:numel(fieldstoupdate)
    fname = fieldstoupdate{ii};
    if isfield(Links, fname)
        % Find where string does not start with 'DND' or 'sw_' followed byone or more digits
        tmp = regexprep({Links.(fname)}, '^(?!DND|sw_\d+).*', 'RBR');

        % Assign the resulting cell array back to Links
        [Links(:).(fname)] = tmp{:};
    end
end

给我们以下内容:

  src       dest      type
_______    _______    ____

'dev_1'    'sw_2'     'S' 
'dev_2'    'sw_2'     'S' 
'dev_4'    'DND'      'S' 
'DND'      'dev_1'    'Y' 
'sw_2'     'dev_2'    'S' 
'sw_2'     'dev_4'    'D' 

请注意,我还使用了Dynamic Field Referencing来简化循环。

您还可以使用table并直接重新分配值。

使用相同的示例结构:

 src       dest     type
______    ______    ____

'RBR'     'sw_2'    'S' 
'RBR'     'sw_2'    'S' 
'RBR'     'DND'     'S' 
'DND'     'RBR'     'Y' 
'sw_2'    'RBR'     'S' 
'sw_2'    'RBR'     'D' 

提供相同的结果。