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

Фон

Я планирую создать большое количество 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 ответа

Решение

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

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

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

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

Вы можете определить класс дескриптора, который содержит таблицу как ее свойство. Определить 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;
Другие вопросы по тегам