如果表的属性是多少,为什么更改表的变量名不起作用?

时间:2018-01-24 12:53:45

标签: matlab matlab-class matlab-table

过去,我一直在广泛使用Matlab的table课程。 这个非常简单的代码,在脚本内或在提示符下,按预期工作:

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

现在,我与table的{​​{1}}具有相同的property

handle class

如果我在命令提示符处执行以下操作,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 也不会改变它们。

这是一个错误,还是我错过了什么? (我正在使用Matlab R2017b)

1 个答案:

答案 0 :(得分:4)

这似乎是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

VS。

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