Используйте Matlab copy-on-write, гарантируя, что аргументы функции доступны только для чтения? - PullRequest
0 голосов
/ 25 ноября 2018

Фон

Я планирую создать большое количество объектов Matlab table один раз, чтобы я мог быстро обращаться к их содержимому несколько раз.Насколько я понимаю, каждая переменная / столбец таблицы обрабатывается в режиме копирования при записи.То есть, если столбец таблицы не модифицируется функцией, то новая копия не создается.

Из того, что я помню о C ++ по состоянию на 1,5 десятилетия назад, я мог бы убедиться, что код для функции делаетне изменять данные своего аргумента с помощью формализма с постоянной корректностью.

Конкретный вопрос

В настоящее время я не использую C ++, но я бы хотел добиться аналогичногоЭффект от того, что код моей функции Matlab не изменяет данные для выбранных аргументов, непреднамеренно или иначе.Кто-нибудь знает небрежный способ сделать это, или, что не менее важно, является ли это нереалистичным ожиданием?

Я использую R2015b.

PS Я имеюВ сети искал и наткнулся на различные релевантные статьи, например:

http://www.mathworks.com/matlabcentral/answers/359410-is-it-possible-to-avoid-copy-on-write-behavior-in-functions-yet

http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data (которые мне нужно прояснить, чтобы полностью понять, но это не мой приоритет простосейчас)

Однако я не верю, что я преждевременно оптимизирую.Я знаю , что я не хочу изменять таблицы.Мне просто нужен способ обеспечить это без необходимости использовать такие методы, как создание класса-оболочки.

Я разместил это по адресу: * Переполнение стека * Группы Google

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы можете определить класс дескриптора, который содержит таблицу как ее свойство.Определите property set listener, который срабатывает и генерирует ошибку / предупреждение при изменении значения свойства.

classdef WarningTable < handle
    properties (SetObservable)
        t
    end
    methods
        function obj = WarningTable(varargin)
            obj.t = table(varargin);
            addlistener(obj,'t','PreSet',...
                @(a,b)warning('table changed!'));
        end
    end
end

Это должно сгенерировать предупреждение:

mytable = WarningTable;
mytable.t(1,1) = 0;
0 голосов
/ 25 ноября 2018

Нет способа сделать константы переменных в MATLAB, кроме как созданием класса с константной (и статической?) Переменной-членом.Но даже тогда вы можете сделать:

t = const_table_class.table;
t(1,1) = 0; % Created and modified a copy!

Причина, по которой функции не нужно отмечать свои входные данные как const, заключается в том, что аргументы всегда передаются по значению.Таким образом, локальная модификация не изменяет данные в рабочей области вызывающей стороны.const - это то, чего просто не существует в языке MATLAB.

С другой стороны, вы можете быть уверены, что ваши данные не будут изменены ни одной из вызываемых вами функций.Таким образом, пока функция, которая владеет таблицами, не изменяет их, они будут оставаться постоянными.Любая функция, которой вы передаете эти таблицы, если они пытаются изменить их, создаст локальную копию для изменения.Это только локально проблема.Память, используемая этой копией, будет освобождена при выходе из функции.Это будет ошибка в функции, но не повлияет на код вне этой функции.

...