MATLAB:如何对结构体元胞数组的指定字段使用cellfun?
解决Matlab元胞数组结构体字段批量修改问题
嘿,这个需求我太熟了!要给元胞数组里每个结构体的val2字段都加上50,咱们得先调整下你给出的cellfun调用思路——直接用@plus行不通,因为@plus是针对纯数值的加法操作,而咱们每个元胞里装的是结构体,得先定位到val2字段再做修改,同时还要保留其他字段的内容。
最直接的实现方式
你需要自定义一个匿名函数,专门处理每个元胞中的结构体:
% 先初始化示例元胞数组 cellArray{1,1}.val1 = 10; cellArray{1,1}.val2 = 20; cellArray{1,2}.val1 = 1000; cellArray{1,2}.val2 = 2000; % 用cellfun批量修改val2字段 out = cellfun(@(s) struct('val1', s.val1, 'val2', s.val2 + 50), cellArray, 'UniformOutput', false);
代码细节解释
@(s) struct('val1', s.val1, 'val2', s.val2 + 50):这个匿名函数接收每个元胞里的结构体s,返回一个新结构体——原val1的值完全保留,val2则加上50。'UniformOutput', false:必须设置这个参数,因为每个元胞返回的是结构体(不是单一数值),所以要确保输出是元胞数组格式。
贴合你给出的@plus模板的写法
如果你坚持想用@plus来实现,那得分两步走:先提取所有val2字段做加法,再把结果写回结构体:
% 第一步:提取所有val2并加50 val2_plus50 = cellfun(@plus, cellfun(@(x) x.val2, cellArray, 'UniformOutput', false), repmat({50}, size(cellArray)), 'UniformOutput', false); % 第二步:把修改后的val2写回结构体(生成新的元胞数组) out = cellfun(@(s, new_val2) struct('val1', s.val1, 'val2', new_val2), cellArray, val2_plus50, 'UniformOutput', false);
不过第一种方式更高效简洁,不需要额外的中间变量~
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

