将方法添加到Matlab表类

时间:2016-01-05 00:22:09

标签: matlab oop

我希望在nansubset类中添加一个名为table的方法。从本质上讲,它允许您拨打T(r,c),其中rc是真正的正整数向量,可能包含NaN

nansubset.m的存根代码可以是:

function T = nansubset(T, r, c)
T = T(r,c);
end    

我按照说明here详细说明了如何向cell类添加新方法。基本上,在我的Matlab路径上的文件夹中,我创建了一个名为@table的文件夹,并在此文件夹中创建一个名为nansubset.m的文件。

我遇到了以下问题:

>> tmpT = table(); nansubset(tmpT, 1, 1)
Undefined function 'nansubset' for input arguments of type 'table'.

>> doc @table/nansubset
Your search - @table/nansubset - did not match any documents.

然而:

edit nansubset

edit @table/nansubset

都在我的编辑器中打开方法文件。

此外,我按照上述链接中的说明将plus方法添加到cell类,并发现它完美无缺。

有人可以向我解释如何将这个额外的方法添加到table课程中吗?

1 个答案:

答案 0 :(得分:3)

随着Matlab R2012b(版本8)的发布,the class folder behavior changed强调是我的):

  

在MATLAB版本5到7中,类文件夹不会影响具有相同名称但位于以后路径文件夹中的其他类文件夹。相反,类具有相同名称的所有类文件夹中的方法组合定义了类。这不再是真的

     

为了向后兼容,在类文件夹中定义的类始终优先于具有相同名称的函数和脚本,甚至优先于路径上它们之前的那些。

两个粗体语句的组合解释了行为:

  • cell是一个内置的Matlab函数,它早于返回其类实例的新OOP规则。在R2012b之前,将方法添加到名为@cell的类文件夹中,将方法添加到从cell函数返回的对象(未使用classdef或类文件夹定义);保留此功能是为了与旧版用户代码兼容。
  • 在R2012b之后添加了
  • table,通过类文件夹定义,并且是Sealed。由于它是Sealed,因此无法进行子类化。使用新规则,任何没有关联@table文件的classdef文件夹都不会注册为类文件夹,也不会将其方法组合到现有类中,除非它是遗留系统的一部分(如{ {1}})。

我可以看到我认为最好的顺序中列出的三种解决方法:

  1. 在Matlab路径上有一个函数,就像你拥有的函数一样,并且总是使用函数符号而不是点符号来调用“方法”。如果您需要更多“方法”,请将它们分组到路径中的文件夹或包中(如果需要良好的命名空间)。由于cell是一个值类,因此该选项看起来并不糟糕。
  2. 创建一个如下所示的包装类。它很麻烦,但会自动封装附加功能。

    table
  3. 创建classdef MyTable < handle properties tab; end methods function mytab = MyTable(varargin) mytab.tab = table(varargin{:}); end function tabnan = nansubset(mytab,r,c) tabnan = mytab.tab(r,c); end end end 的本地副本并直接添加方法。我不能想到这本身有任何巨大的弊端,但感觉这样复杂的内部结构很奇怪。