matlab - 使用动态字段名的嵌套结构访问

标签 matlab

我想使用动态字段名而不是 setfield 实现以下目标:

假设一个结构“myStruct”有一组嵌套结构,即

myStruct.a.b.c = 0
myStruct.a.d = 0
myStruct.a.e.f.g = 0

我希望能够灵活设置叶子结构值如下:

fields = {'a', 'b', 'c'}
paramVal = 1
setfield(myStruct, fields{:}, paramVal)

这可以使用 setfield。有没有一种语法可以使用动态字段名来做到这一点?以下显然不起作用,因为字段名需要是字符串而不是数组,但演示了我想要的内容:

myStruct.(fields{:}) = 0

相当于:

myStruct.('a').('b').('c') = 0

最佳答案

没有 eval 的递归解决方案,从我的一个旧实用函数中提取:

function s = setsubfield(s, fields, val)

if ischar(fields)
    fields = regexp(fields, '\.', 'split'); % split into cell array of sub-fields
end

if length(fields) == 1
    s.(fields{1}) = val;
else
    try
        subfield = s.(fields{1}); % see if subfield already exists
    catch
        subfield = struct(); % if not, create it
    end
    s.(fields{1}) = setsubfield(subfield, fields(2:end), val);
end

我猜 try/catch 可以用 if isfield(s, fields{1}) ... 代替,我不记得我为什么编码了就像那样。

用法:

>> s = struct();
>> s = setsubfield(s, {'a','b','c'}, 55);
>> s = setsubfield(s, 'a.b.d.e', 12)
>> s.a.b.c
ans =
    55
>> s.a.b.d.e
ans =
    12

关于matlab - 使用动态字段名的嵌套结构访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145042/

相关文章:

c++ - Matlab:dll 的 C++ 头文件

matlab - 了解 matlabFunction

Matlab函数判断一个函数是否连续?

Matlab:我可以锁定 Y 轴(即使使用放大/缩小)吗?

matlab - 固定步长增加时的 Simulink 积分器错误

arrays - 在matlab中对齐两个数组

performance - 在 MATLAB 中采用早期救助

matlab - imread 如何缩放 12 位图像?

java - 如何使用参数调用matlab函数并捕获java中的输出?

matlab - 从 Matlab 中的任意离散概率密度函数生成随机样本