【问题标题】:1-line try/catch equivalent in MATLABMATLAB 中的 1 行 try/catch 等效项
【发布时间】:2023-04-03 03:10:01
【问题描述】:

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

swimming = fish.carp;

但是字段carp 可能会也可能不会被定义。如果carp 不是有效字段,有没有办法指定默认值?例如,在 Perl 中我会写

my $swimming = $fish{carp} or my $swimming = 0; 

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

【问题讨论】:

  • 在 Perl 中最好写成 my $swimming = $fish{carp} // 0; (5.10+) 或 my $swimming = ( exists $fish{carp} ) ? $fish{carp} : 0; (
  • 您可能是对的,但这并不能回答我的问题 (-1)。
  • 这就是为什么它是评论,而不是答案。
  • fish.carp 的可能值是多少?是boolean吗?
  • 这是一个结构字段,可能存在也可能不存在(即结构fish始终存在,但它可能有也可能没有字段carp)。实际值是整数。

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


【解决方案1】:

如果您不喜欢在单独的函数文件中定义自定义函数(这当然是一个不错的选择),您可以改为在脚本开头定义两个匿名函数

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

【讨论】:

    【解决方案2】:

    据我所知,您不能在 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。这样,它不会牺牲代码的可读性,但您需要创建一个自定义函数来执行您想要的操作。

    【讨论】:

    • OP 询问:“为了代码的可读性,我宁愿不使用 if 语句 ...
    • @Ratbert - 我知道......我告诉 OP 它不能完成......至少我看不到。我正在做一些测试,看看我是否可以在没有这个的情况下将其归结为一行。
    • 您可以用逗号将所有内容放在一行中:if isfield(fish, 'carp'), swimming = fish.carp; else, swimming = 0; end,但这不是很有帮助...
    • @Ratbert - 哈哈哈是真的!
    • 当然,我无法想象你会做这样的事情。这不是我们第一次在同一时间同时思考同一件事。丹尼尔在另一个问题上刚刚发生...
    【解决方案3】:

    您可以创建自己的函数来处理此问题并保持代码相当清晰。比如:

    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
    

    最好的,

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2013-04-27
      • 2011-04-15
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多