过去,我一直在广泛使用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)
答案 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