Почему изменение имени переменной таблицы не работает, если это свойство класса?
В прошлом я широко использовал Matlab's table
учебный класс. Этот очень простой код внутри скрипта или в командной строке работает как положено:
varNames = {'Date_time', 'Concentration_1', 'Concentration_2'};
testTable = array2table(zeros(5,3), 'VariableNames', varNames)
Теперь у меня есть то же самое table
как 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
Четное tc.testTable.Properties.VariableNames = varNames
не меняет их.
Это ошибка, или я что-то упустил? (Я использую Matlab R2017b)
1 ответ
Решение
Это похоже на ошибку в проверке размера свойства MATLAB, так как поведение исчезает при удалении:
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