如果是 Class 的 属性,为什么更改 Table 的变量名称不起作用?

Why does changing the Variable Name of a Table not work if it's the Property of a Class?

过去,我一直大量使用 Matlab 的 table class。 这个非常简单的代码,在脚本中或在提示符下,按预期工作:

varNames = {'Date_time', 'Concentration_1', 'Concentration_2'};
testTable = array2table(zeros(5,3), 'VariableNames', varNames)

现在,我的 tablehandle classproperty 相同。

classdef TestClass < handle
    properties
        testTable (:,3) table
    end
    methods
        function testMethod(obj)
            varNames = {'Date_time', 'Concentration_1', 'Concentration_2'};
            obj.testTable = array2table(zeros(5,3), 'VariableNames', varNames);
            obj.testTable.Properties.VariableNames
        end
    end
end

如果我在命令提示符下执行以下命令,zeros 将分配给 table,但 VariableNames 保留其默认值,即 {'Var1', 'Var2'}等等

tc = TestClass; tc.testMethod

即使 tc.testTable.Properties.VariableNames = varNames 也不会改变它们。

这是一个错误,还是我遗漏了什么? (我使用的是 Matlab R2017b)

这似乎是 MATLAB property size validation 的错误,因为删除后行为消失:

classdef SOcode < handle
    properties
        testTable(:,3) = table(1, 2, 3, 'VariableNames', {'a', 'b', 'c'});
    end
end

>> asdf.testTable

ans =

  1×3 table

    Var1    Var2    Var3
    ____    ____    ____

    1       2       3

对比

classdef SOcode < handle
    properties
        testTable = table(1, 2, 3, 'VariableNames', {'a', 'b', 'c'});
    end
end

>> asdf.testTable

ans =

  1×3 table

    a    b    c
    _    _    _

    1    2    3

在 TMW 解决该错误之前,可以使用自定义验证函数来解决此问题以保留所需的行为:

classdef SOcode < handle
    properties
        testTable table {TheEnforcer(testTable)}
    end
    methods
        function testMethod(obj)
            varNames = {'Date_time', 'Concentration_1', 'Concentration_2', 'hi'};
            obj.testTable = array2table(zeros(5,4), 'VariableNames', varNames);
            obj.testTable.Properties.VariableNames
        end
    end
end

function TheEnforcer(inT)
ncolumns = 3;
if ~isempty(inT)
    if size(inT, 2) ~= ncolumns
        error('An Error')
    end
end
end