Ole*_*leg 18 oop methods matlab overriding
设置Win7 64b,R2015b,16 GB RAM,CPU i7-2700
这table()
是一个基本的Matlab类,它也是密封的,因此我不能将它子类化.
我想修复这个类的一些方法并添加新的方法.例如,table.disp()
从根本上被打破,例如,尝试不disp(table(rand(1e7,1)))
,或忘记;
在命令窗口中.该变量在RAM中仅占用76 MB,但显示器是无缓冲的,它会使系统失速!
table.disp()
不写入的方法matlabroot\toolbox\matlab\datatypes\@table
吗?我可以使用新方法扩展表类C:\MATLAB\@table\ismatrixlike.m
吗?我为什么得到
ismatrixlike(table)
Undefined function 'ismatrixlike' for input arguments of type 'table'.
Run Code Online (Sandbox Code Playgroud)
显然,我做到了
addpath C:\MATLAB\
rehash toolboxcache
Run Code Online (Sandbox Code Playgroud)
我也试过了clear all
.
该路径具有(字母)优先级matlabroot
,但缺少table.m
类定义.如果我将本机类定义添加到C:\MATLAB\@table
,那么我可以运行我的新方法(在a之后clear all
).然而:
>> methods(table)
Methods for class table:
classVarNames ismatrixlike table varfun
convertColumn renameVarNames unstack
Run Code Online (Sandbox Code Playgroud)
只列出新\@table
文件夹中的方法,即使(某些)旧方法仍然有效,例如
size(table)
Run Code Online (Sandbox Code Playgroud)
这部分解决了这个问题,因为现在,本机\@table\private
文件夹不再可访问,因此许多本机方法都被破坏了!
我为什么要这样做?因为在table()
修复之前我不想再等待2年.我已经失去了整整一天,因为我只是;
在命令窗口中忘了一个,如果它正在运行多天模拟,我不能强行重启我的电脑,但我必须等待磁盘交换结束:(.
附录
更多关于的背景信息disp(table(rand(1e7,1)))
.这就是当我点击它时会发生的事情(幸运的是我的速度足够CTRL-C):
罪魁祸首是第172 table.disp()
行将数值数组转换为单元格字符串(也使用填充!):
[cells, err, isLeft] = sprintfc(f, x, b);
Run Code Online (Sandbox Code Playgroud)
以下对我有用:
定义一个修改后的disp
函数,例如disp_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
Run Code Online (Sandbox Code Playgroud)定义disp
为修改后的函数的函数句柄(默认情况下您可以这样做startup.m
以始终拥有它):
disp = @disp_modified;
Run Code Online (Sandbox Code Playgroud)之后,在命令窗口中我得到
>> 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!
Run Code Online (Sandbox Code Playgroud)