MATLAB中的1行try / catch等价物

时间:2015-04-02 19:41:10

标签: matlab perl try-catch variable-assignment default

我在MATLAB中有一种情况,我想尝试将一个struct字段分配给一个新变量,如下所示:

swimming = fish.carp;

但是可以定义字段carp,也可以不定义字段carp。如果my $swimming = $fish{carp} or my $swimming = 0; 不是有效字段,是否可以指定默认值?例如,在Perl中我会写

or

其中0是默认值,if指定分配失败时要执行的操作。似乎在MATLAB中应该存在类似的东西,但我似乎无法找到它的任何文档。为了代码可读性,如果我能帮助它,我宁愿不使用try/catch语句或{{1}}块。

3 个答案:

答案 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