MATLAB:重写table()方法
设置Win7 64b、R2015b、16 GB RAM、CPU i7-2700MATLAB:重写table()方法,matlab,oop,methods,overriding,Matlab,Oop,Methods,Overriding,设置Win7 64b、R2015b、16 GB RAM、CPU i7-2700 table()是一个也被密封的类,因此我不能对它进行子类化 我想修改这个类的一些方法,并添加新的方法。 例如,table.disp()在命令窗口中。该变量在RAM中仅占用76 MB,但显示是无缓冲的,它将使您的系统暂停 我是否可以重写table.disp()等方法,而不写入matlabroot\toolbox\matlab\datatypes\@table 我可以在C:\MATLAB\@table\ismatrixl
table()
是一个也被密封的类,因此我不能对它进行子类化
我想修改这个类的一些方法,并添加新的方法。
例如,table.disp()代码>在命令窗口中。该变量在RAM中仅占用76 MB,但显示是无缓冲的,它将使您的系统暂停
我是否可以重写table.disp()
等方法,而不写入matlabroot\toolbox\matlab\datatypes\@table
我可以在C:\MATLAB\@table\ismatrixlike.m
下用新方法扩展table类吗?为什么我会受伤
ismatrixlike(table)
Undefined function 'ismatrixlike' for input arguments of type 'table'.
显然是的
addpath C:\MATLAB\
rehash toolboxcache
我还尝试了清除所有
路径的(字母)优先级高于matlabroot
,但缺少表.m
类定义。如果我将本机类定义添加到C:\MATLAB\@table
,那么我可以运行我的新方法(在清除所有
之后)。然而:
>> methods(table)
Methods for class table:
classVarNames ismatrixlike table varfun
convertColumn renameVarNames unstack
仅列出新\@表
文件夹中的方法,即使(某些)旧方法仍然有效,例如
size(table)
这部分地解决了问题,因为现在,本机\@table\private
文件夹不再可访问,因此许多本机方法被破坏
我为什么要这样做?因为我不想再等2年才能修复table()
。我已经损失了整整几天,因为我忘了一个代码>在命令窗口中,如果我的电脑正在运行多天模拟,我无法强制重新启动,但我必须等待磁盘交换结束:(
附录
关于disp(table(rand(1e7,1)))
的更多上下文。当我点击它时会发生这种情况(幸运的是,我的速度足够快,可以从中CTRL-C):
罪魁祸首是table.disp()
的第172行,它将数字数组转换为一个单元格字符串(也带有填充!):
以下是我的作品:
定义一个修改后的disp
函数,比如disp\u modified.m
,如下所示,并将其放在您的路径中:
function disp_modified(t)
if istable(t)
%// Do whatever you want to display tables
builtin('disp', '''disp'' function intercepted!')
else
%// For non-tables, call `disp` normally
builtin('disp', t)
end
将disp
定义为修改后的函数的一部分(您可以在startup.m
中执行此操作,以便在默认情况下始终拥有它):
在此之后,在命令窗口中
>> disp(1:5)
1 2 3 4 5
>> disp({1 2 3 'bb'})
[1] [2] [3] 'bb'
>> disp(table(rand(1e3,1)))
'disp' function intercepted!
在尝试了几个备选方案后,我采用了与Matlab的原生@table
实现相互影响最小的解决方案,如果出现问题,它很容易被删除
解决方案:
- 将整个
@table
文件夹,即完整文件(matlabroot、'toolbox'、'matlab'、'datatypes'、'table')
复制到具有写入权限的目标中
我选择的目标是fullfile(matlabroot、'toolbox'、'local'、'myfiles')
,因为我不必担心操作系统的交叉兼容性,也就是说,matlabroot
会帮我解决这个问题
- 使用新的重载和覆盖方法(部分覆盖复制的原始文件)将
@table
粘贴到目标文件夹中
- 将目标添加到matlab路径,在原始
@表之前,例如添加路径您的目标-开始
影响、利弊:
- 本机的
@table
类/方法现在被隐藏,例如尝试哪个表-all
。但是,这种效果非常清晰,易于检测和删除(删除目标和删除路径)
- 本机
@table
(现在隐藏)和新@table
之间没有奇怪的冲突
- 所有新方法和旧方法都可见,请尝试
方法(表)
- 可以访问私有表方法
- …但你不得不使用它们
- 将新方法(用户实现的)公开给私有方法需要更多的维护和直接处理表实现中的版本冲突
- 您需要对某些符合条件的目标具有写入权限
对于那些对详细信息感兴趣的人,您可以查看,.特别是安装\u tableutils
(自述文件可能不会更新).根据新类的使用情况,也许您可以采用更干净的方法。您在文章中介绍的建议方法有一个缺点,即在更新的环境中使用的代码可能无法轻松移植到新环境,或者在您的环境中执行的程序可能在不同的环境中表现出不同的行为环境
有些问题你可以考虑(也许澄清)可能是:您打算如何使用新类?是否替换所有现有的表使用?是否希望能够使用它而不是表类参数?或者是否希望更改表,以便环境中原始表类的每次使用都使用新类
如果您只需要一个新的改进表来使用,您可以考虑将原始表类封装在一个新的类中。例如,Mytable,将所有不需要的方法委托给原始表方法,替换您想要改进的方法或添加新的方法。
更新:刚刚在Github中看到了完整的解决方案,并且理解了您打算做什么。做得好。我将离开帖子,以防有人发现它有用。让Matlab做工具箱中没有的任何事情……肯定很痛苦。放弃所有希望,这里的用户!请注意,istable
不是table类的方法,而是相反,它自己的函数调用了isa(t,'table')
@Suever感谢您注意到了这一点。我将把它改为table.size()
需要注意的一件事-我发现我可以用CTRL-C来摆脱它
disp = @disp_modified;
>> disp(1:5)
1 2 3 4 5
>> disp({1 2 3 'bb'})
[1] [2] [3] 'bb'
>> disp(table(rand(1e3,1)))
'disp' function intercepted!