1

此响应之后,我开始为数据集做类似的事情。

plus答案中提到的函数,通过将 plus.m 放在@cell-folder 中,我可以很好地处理单元格数组。然而,在 @dataset-folder 中尝试完全相同(略有不同的实现)时,Matlab 仍然为Dataset+Dataset和给出“未定义”错误plus(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

解决方法总结

简短的版本是丹尼尔斯在下面的回答。可在此处找到替代选项的说明。简而言之,它们提供了以下选项(通常用于重载函数-并非所有解决方案都允许使用标准运算符,例如“+”-此处针对当前问题进行了描述)。它们都不能解决我的问题,但可以用作解决方法

  1. 定义一个将所需类作为参数的新函数——aladsplus(ds,ds)
  2. 定义一个新plus函数,您可以在其中捕获和处理要为其实现功能的类,并将其他类重新路由到内置函数。
  3. 丹尼尔斯的建议。
  4. mydataset创建一个继承自dataset( classdef mySym < sym)的新类
  5. 使用组合创建一个新mydataset类(即包含内置dataset作为mydataset类的属性)

我会添加第 6 个选项:离开 Matlab 并学习 Python。一个在今天看起来越来越有吸引力的选项。

4

2 回答 2

1

我不清楚文档,但这可能是预期的行为。首先要意识到的是celldataset类是不同的。该类dataset在@-文件夹中定义,并dataset.mclassdef. 在classdef引入 OO 系统的 R2008a 和 R2012a 之间,文档内容如下:

每个类只有一个@-文件夹

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

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

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

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

请注意,为了向后兼容,@-folders 中定义的类始终优先于具有相同名称的函数和脚本,即使是路径上它们之前的那些。

我现在已经多次阅读文档,但我仍然不知道 R2012a 和 R2012b 之间发生了什么变化。这些都不适用于cell该类,因为它没有在@folder.

于 2013-09-20T18:41:04.477 回答
1

通过在不同的@文件夹中定义方法来扩展类的能力是旧对象对象系统的一个特性,它基于结构(MATLAB 7.6 之前)。

当前的 OOP 系统 ( classdef-style) 不支持这一点,因为 @-folders 将隐藏其他具有相同名称的 @-folders (根据哪个出现在路径上的第一个)。

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

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

>> which dataset
C:\Program Files\MATLAB\R2013a\toolbox\shared\statslib\@dataset\dataset.m
于 2013-09-20T21:13:03.017 回答