关注this response,我开始为数据集做类似的事情。
该答案中提到的plus
函数,通过将plus.m放在@ cell-folder中,我可以正常工作。
但是,在@ dataset文件夹中尝试完全相同(稍微不同的实现)时,Matlab仍然会为Dataset+Dataset
和plus(Dataset,Dataset)
提供“未定义”错误。
我出错了什么?
在当前目录中,有一个文件夹@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'.
变通方法摘要
简短版是Daniels的回答如下。可以找到替代选项的注释here。简而言之,它们提供了以下选项(对于一般的重载功能 - 并非所有解决方案都允许使用标准运算符,例如'+' - 这里针对本期问题进行了描述)。他们都没有解决我的问题,但可以用作解决方法。
dsplus(ds,ds)
plus
函数,在其中捕获并处理要为其实现功能的类,并将其他类重新路由到内置函数。mydataset
(dataset
)classdef mySym < sym
课程
mydataset
类(即包含内置dataset
作为mydataset
类的属性)我会添加第6个选项:离开Matlab并学习Python。这一天看起来越来越吸引人的选择。
答案 0 :(得分:1)
我不清楚文档,但这可能是预期的行为。首先要意识到的是cell
和dataset
类是不同的。 dataset
类在@ -folder中定义,dataset.m
以classdef
开头。在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