如果是 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)
现在,我的 table
与 handle class
的 property
相同。
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
过去,我一直大量使用 Matlab 的 table
class。
这个非常简单的代码,在脚本中或在提示符下,按预期工作:
varNames = {'Date_time', 'Concentration_1', 'Concentration_2'};
testTable = array2table(zeros(5,3), 'VariableNames', varNames)
现在,我的 table
与 handle class
的 property
相同。
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