结构数组为空致赋值错误,如何为三维结构批量新增字段?
解决Matlab结构数组新增字段时的"Invalid dot name structure assignment"错误
错误原因
你直接用form.c_top = form.c(N/2+1:end)这种写法是完全错误的——Matlab的多维结构数组不支持通过顶层字段名直接对所有元素批量做切片赋值,尤其是当新字段需要依赖每个元素自身的c字段内容时,必须逐个元素处理。此外如果循环中form的维度初始化有偏差,也会触发"结构数组为空"的报错,但这里核心问题是批量赋值的方式不符合Matlab结构数组的规则。
解决方案
必须遍历结构数组的每个元素,为每个元素单独添加c_top和c_bot字段,基于该元素自己的c数组做切片。以下两种方法都可以实现:
方法1:嵌套循环(适配原代码结构,直观易懂)
把你原来的两行错误代码替换成下面的嵌套循环:
% 获取结构数组的维度,确保遍历覆盖所有元素 [dim1, dim2, dim3] = size(form); % 逐个元素处理 for j = 1:dim1 for m = 1:dim2 for k = 1:dim3 form(j,m,k).c_top = form(j,m,k).c(N/2+1:end); form(j,m,k).c_bot = form(j,m,k).c(1:N/2); end end end
方法2:用arrayfun简化代码
如果觉得嵌套循环繁琐,可以用arrayfun批量处理:
% 为每个结构元素添加新字段 form = arrayfun(@(elem) ... setfield(elem, 'c_top', elem.c(N/2+1:end), 'c_bot', elem.c(1:N/2)), ... form, 'UniformOutput', false); % 将cell数组转回原维度的结构数组 form = reshape(cat(1, form{:}), size(form));
额外注意事项
- 确保
N是偶数,否则N/2会产生小数,导致切片索引报错;如果N可能为奇数,建议用ceil(N/2)或floor(N/2)调整切片位置 - 检查循环创建
form时,Cr、TR、pH的长度是否分别为3、4、4,保证form是预期的3×4×4结构数组,避免出现空结构的情况
内容的提问来源于stack exchange,提问作者GMIC
相关产品推荐
相关产品推荐

