Matlab数据集数组上的重载运算符

时间:2013-09-19 13:20:45

标签: matlab oop dataset operator-overloading

关注this response,我开始为数据集做类似的事情。

该答案中提到的plus函数,通过将plus.m放在@ cell-folder中,我可以正常工作。 但是,在@ dataset文件夹中尝试完全相同(稍微不同的实现)时,Matlab仍然会为Dataset+Datasetplus(Dataset,Dataset)提供“未定义”错误。

我出错了什么?

编辑1

在当前目录中,有一个文件夹@dataset(与工作的@cell文件夹相同),包含包含代码的文件plus.m:

function C = plus(A,B)
% assuming same size, valid type, etc.
C = zeros(size(A));
for i = 1:size(A,2)
    C(:,i) = A.(i) + B.(i);
end
end

在命令提示符中,尝试:

ds = dataset({1,'a'},{2,'b'});
ds+ds

Matlab抛出错误: Undefined function 'plus' for input arguments of type 'dataset'.

编辑2

变通方法摘要

简短版是Daniels的回答如下。可以找到替代选项的注释here。简而言之,它们提供了以下选项(对于一般的重载功能 - 并非所有解决方案都允许使用标准运算符,例如'+' - 这里针对本期问题进行了描述)。他们都没有解决我的问题,但可以用作解决方法。

  1. 定义一个新函数,将所需的类作为参数 - ala dsplus(ds,ds)
  2. 定义一个新的plus函数,在其中捕获并处理要为其实现功能的类,并将其他类重新路由到内置函数。
  3. 丹尼尔斯的建议。
  4. mydatasetdataset
  5. 继承新的classdef mySym < sym课程
  6. 使用合成创建一个新的mydataset类(即包含内置dataset作为mydataset类的属性)
  7. 我会添加第6个选项:离开Matlab并学习Python。这一天看起来越来越吸引人的选择。

2 个答案:

答案 0 :(得分:1)

我不清楚文档,但这可能是预期的行为。首先要意识到的是celldataset类是不同的。 dataset类在@ -folder中定义,dataset.mclassdef开头。在R2008a之间,当classdef OO系统被引入时,R2012a在文档中读到:

  

每班只有一个@ -Folder

     

对于使用新classdef关键字定义的类,使用@ -folder   在MATLAB路径上隐藏所有@-文件夹。类   @ -folders中定义的必须在该单个文件中找到所有类文件   夹。但是,@ -folders中定义的类继续占用   优先于具有相同名称的函数和脚本,甚至是那些   在路径上出现的功能和脚本。

在R2012b(即MATLAB 8.0)中,文档变为:

  

@ -Folders中定义的类的先前行为

     

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

     

请注意,为了向后兼容,在@ -folders中定义了类   始终优先于具有相同功能和脚本的功能   名字,甚至是那些在路上出现的人。

我现在已多次阅读文档,但我仍然不知道R2012a和R2012b之间的变化。这些都不适用于cell类,因为它未在@folder中定义。

答案 1 :(得分:1)

通过在不同的@ -folder中定义方法来扩展类的能力是the old object object system的一个特征,它基于struct(在MATLAB 7.6之前)。

当前的OOP系统(classdef - 样式)不支持此功能,因为@ -folders会影响其他具有相同名称的@文件夹(根据路径中首先显示的那个)。

现在cell(内置类型/类)显然基于旧系统,因为您可以在路径上的任何位置定义@cell/plus.m函数并且它可以正常工作。

但是dataset是在新系统(classdef)中定义的类,因此您不能以这种方式扩展它,除非您将函数放在工具箱自己的目录中(您需要rehash之后的工具箱路径,以使其生效)。

>> which dataset
C:\Program Files\MATLAB\R2013a\toolbox\shared\statslib\@dataset\dataset.m