我在MATLAB中有一种情况,我想尝试将一个struct字段分配给一个新变量,如下所示:
swimming = fish.carp;
但是可以定义字段carp
,也可以不定义字段carp
。如果my $swimming = $fish{carp} or my $swimming = 0;
不是有效字段,是否可以指定默认值?例如,在Perl中我会写
or
其中0是默认值,if
指定分配失败时要执行的操作。似乎在MATLAB中应该存在类似的东西,但我似乎无法找到它的任何文档。为了代码可读性,如果我能帮助它,我宁愿不使用try/catch
语句或{{1}}块。
答案 0 :(得分:4)
您可以使用自己的功能来处理此问题,并使代码保持清晰。类似的东西:
swimming = get_struct(fish, 'carp', 0);
带
function v = get_struct(s, f, d)
if isfield(s, f)
v = s.(f); % Struct value
else
v = d; % Default value
end
最佳,
答案 1 :(得分:3)
据我所知,你不能在MATLAB的一行中做到这一点。 MATLAB逻辑结构需要显式的if/else
语句,不能在一行中完成...就像在Perl或Python中一样。
您可以做的是检查fish
结构是否包含carp
字段。如果不是,则可以将默认值设置为0.
使用isfield
来帮助您做到这一点。因此:
if isfield(fish, 'carp')
swimming = fish.carp;
else
swimming = 0;
end
另外,正如Ratbert所说,你可以用逗号分成一行......但是,你仍然需要if/else
构造:
if isfield(fish,'carp'), swimming = fish.carp; else, swimming = 0;
另一种可行的解决方法是自己声明一个自定义函数,它接受一个结构和一个字段,并允许它在字段中返回值,或者为0.
function [out] = get_field(S, field)
if isfield(S, field)
out = S.(field);
else
out = 0;
end
然后,你可以这样做:
swimming = get_field(fish, 'carp');
swimming
将为0或fish.carp
。这样,它不会牺牲代码的可读性,但是你需要创建一个自定义函数来做你想要的。
答案 2 :(得分:3)
如果您不想在单独的函数文件中定义自定义函数 - 这当然是一个不错的选择 - 您可以在脚本的开头定义两个匿名函数。
helper = {@(s,f) 0, @(s,f) s.(f)}
getfieldOrDefault = @(s,f) helper{ isfield(s,f) + 1 }(s,f)
定义
fish.carp = 42
和函数调用
a = getfieldOrDefault(fish,'carp')
b = getfieldOrDefault(fish,'codfish')
你得到第一个
a = 42
以及之前为第二种情况定义的默认值
b = 0