Почему изменение имени переменной таблицы не работает, если это свойство класса?

В прошлом я широко использовал 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
Другие вопросы по тегам