代码之家  ›  专栏  ›  技术社区  ›  SilentGhost

是否可以在matlab中提供订阅的默认值?

  •  3
  • SilentGhost  · 技术社区  · 15 年前

    在matlab中,当试图访问不存在的矩阵元素时,通常会产生一个错误:

    >> month(0)
    ??? Subscript indices must either be real positive integers or logicals.
    

    我想知道是否有一个函数允许在这种情况下提供默认值。例如。,:

    >> get_def(month(0), NaN)
    ans =
       NaN
    

    P.S.我可以解决这个下标的特殊情况。( 0 但是我想知道更通用的方法。

    2 回复  |  直到 15 年前
        1
  •  2
  •   gnovice    15 年前

    没有内置的matlab函数可以满足您的需求。你 能够 使用A try-catch 块:

    >> try a = month(0); catch a = nan; end
    >> a
    
    a =
    
       NaN
    

    但是,最好的选择可能是错误地检查索引 第一 ,如果超出范围,则引发错误或将变量设置为默认值。

    如果你真的想尝试使用一个可能是0的索引,你可以自己写 get_def 功能。有一种方法可以做到:

    function value = get_def(vector,index,defaultValue)
      try
        value = vector(index);
      catch
        value = defaultValue;
      end
    end
    

    然后您将以以下方式使用此函数:

    >> month = 1:12;
    >> get_def(month,0,nan)
    
    ans =
    
       NaN
    
    >> get_def(month,1,nan)
    
    ans =
    
         1
    
        2
  •  3
  •   b3.    15 年前

    一个优雅的解决方案是创建内置的子类 双重的 matlab类和重载 亚瑟夫 方法:

    classdef myDouble < double
    
        methods
    
            function obj = myDouble(val)
                obj = obj@double(val);
            end
    
            function val = subsref(obj, S)
                try
                    val = subsref@double(obj, S);
                catch
                    val = NaN;
                end
            end
    
        end
    
    end
    

    然后您可以使用如下类:

    >> a = myDouble(1:10);
    >> a(1:3)
    
    ans = 
      myDouble
      double data:
         1     2     3
    
      Methods, Superclasses
    
    >> a('asdsa')
    
    ans =
       NaN
    
    >> a({1, 'asdf'})
    
    ans =
       NaN
    

    因为子类继承自 双重的 类,您仍然可以获得 双重的 类和自定义的附加功能 我的双倍 班级。

    查看matlab帮助: