【发布时间】:2023-03-18 23:07:01
【问题描述】:
设置 Win7 64b、R2015b、16 GB RAM、CPU i7-2700
table() 是一个fundamental Matlab class,它也是密封,因此我不能继承它。
我想修复这个类的一些方法并添加新的方法。
例如,table.disp() 从根本上被破坏了,例如不要尝试disp(table(rand(1e7,1))),或者忘记命令窗口中的;。该变量在 RAM 中仅占用 76 MB,但显示没有缓冲,它会停止您的系统!
- 我可以在不写入
matlabroot\toolbox\matlab\datatypes\@table的情况下覆盖像table.disp()这样的方法吗? -
我可以用
C:\MATLAB\@table\ismatrixlike.m下的新方法扩展表类吗?为什么我会得到ismatrixlike(table) Undefined function 'ismatrixlike' for input arguments of type 'table'.显然,我做到了
addpath C:\MATLAB\ rehash toolboxcache我也试过
clear all。路径优先于
matlabroot,但缺少table.m类定义。如果我将本机类定义添加到C:\MATLAB\@table,那么我可以运行我的新方法(在clear all之后)。然而:>> methods(table) Methods for class table: classVarNames ismatrixlike table varfun convertColumn renameVarNames unstack仅列出新
\@table文件夹中的方法,即使(某些)旧方法仍然有效,例如size(table)这部分解决了问题,因为现在原生的
\@table\private文件夹无法再访问,因此许多原生方法都被破坏了!
我为什么要这样做?因为我不想再等 2 年才能修复 table()。我已经失去了一整天,因为我只是在命令窗口中忘记了;,如果我的电脑正在运行多日模拟,我无法强制重启,但我必须等待磁盘交换结束:(。
附录
有关disp(table(rand(1e7,1))) 的更多上下文。当我击中它时会发生这种情况(幸运的是我足够快,可以用 CTRL-C 退出它):
罪魁祸首是table.disp() 的第 172 行,它将数值数组转换为单元字符串(也有填充!):
[cells, err, isLeft] = sprintfc(f, x, b);
【问题讨论】:
-
让 Matlab 做任何 没有 已经在工具箱中的事情......肯定会很痛苦。放弃所有希望,你们进入这里!
-
请注意
istable不是表类的方法,而是它自己的函数调用isa(t, 'table')。 -
@Suever 感谢您注意到这一点。我会改成
table.size() -
有一点需要注意——我发现我可以 CTRL-C 退出那个表
display你抱怨的例子...... -
一个问题:
ismatrixlike与现有的ismatrix有何不同?
标签: matlab oop methods overriding