MATLAB:重写table()方法

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,但显示器是无缓冲的,它会使系统失速!

  1. 我可以覆盖table.disp()不写入的方法matlabroot\toolbox\matlab\datatypes\@table吗?
  2. 可以使用新方法扩展表类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)

Lui*_*ndo 1

以下对我有用:

  1. 定义一个修改后的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)
  2. 定义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)

  • 这需要您显式调用“disp”。我相信他想要重载“table”对 disp 的内部调用,它将始终(无论您的本地函数如何)使用内置的“disp”。这至少是防止省略分号时发生的情况所需要的。 (2认同)