【问题标题】:Overload operator on Matlab dataset arrayMatlab数据集数组上的重载运算符
【发布时间】:2013-09-24 14:30:29
【问题描述】:

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

该答案中提到的plus 函数,通过将plus.m 放在@cell 文件夹中,我可以很好地处理单元格数组。 然而,在 @dataset-folder 中尝试完全相同(略有不同的实现)时,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

解决方法总结

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

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

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

【问题讨论】:

  • 检查你对 CapiTaLs 的使用...数据集与数据集
  • 你能给我们足够的信息来重现这个问题吗?
  • @Nick 上述软件中的Dataset 旨在用作数据集类型的变量名(ala MyDataset)。

标签: matlab oop dataset operator-overloading


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    通过在不同的@文件夹中定义方法来扩展类的能力是the old object object system的一个特性,它基于struct(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 2012-02-21
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多