我有一个结构数组,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
...
编辑:
我需要通过将DND
和sw_*
元素以外的所有元素替换为RBR来更改上面的struct数组,同时保留DND
和sw_*
字段,那就是:
==================
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.
但是可能有一种更简单的方法。
答案 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'
提供相同的结果。