通过确保函数参数是只读的来利用 Matlab 写时复制?
Exploit Matlab copy-on-write by ensuring function arguments are read-only?
背景
我打算一次创建大量的Matlab table
对象,以便我可以快速地重复引用它们的内容。我的理解是每个 table variable/column 都以写时复制方式处理。也就是说,如果 table 列未被函数修改,则不会创建新副本。
根据我对 1.5 年前的 C++ 的记忆,我可以确保函数的代码不会通过使用常量正确性形式主义来修改其参数的数据。
具体问题
这些天我没有使用 C++,但我想实现类似的效果,确保我的 Matlab 函数的代码不会无意或以其他方式更改所选参数的数据。有谁知道这样做的不麻烦的方法,或者同样重要的是,这是否是一个不切实际的期望?
我正在使用 R2015b。
P.S. 我在网上搜索过并找到了各种相关文章,例如:
http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data
(我需要澄清才能完全理解,但这不是我现在的首要任务)
但是,我不认为我过早地进行了优化。我 知道 我不想修改 table。我只需要一种方法来强制执行它,而不必像创建包装器那样经历扭曲 class.
我已将此张贴在:
*
* Google groups
在 MATLAB 中无法使变量成为常量,除非创建具有常量(和静态?)成员变量的 class。但即便如此你也可以这样做:
t = const_table_class.table;
t(1,1) = 0; % Created and modified a copy!
函数不需要将其输入标记为 const 的原因是因为参数始终按值传递。因此,本地修改不会修改调用者工作区中的数据。 const
是 MATLAB 语言中不存在的东西。
另一方面,您可以确定您的数据不会被您调用的任何函数修改。因此,只要拥有表的函数不修改它们,它们就会保持不变。您将这些表传递给的任何函数,如果它们试图修改它们,它们将创建一个要修改的本地副本。这只是局部问题。此副本使用的内存将在函数退出时释放。这将是函数中的错误,但不会影响此函数之外的代码。
您可以定义一个包含 table 的句柄 class 作为它的属性。定义一个 property set listener
,当 属性 的值发生变化时触发并生成 error/warning。
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;
背景
我打算一次创建大量的Matlab table
对象,以便我可以快速地重复引用它们的内容。我的理解是每个 table variable/column 都以写时复制方式处理。也就是说,如果 table 列未被函数修改,则不会创建新副本。
根据我对 1.5 年前的 C++ 的记忆,我可以确保函数的代码不会通过使用常量正确性形式主义来修改其参数的数据。
具体问题
这些天我没有使用 C++,但我想实现类似的效果,确保我的 Matlab 函数的代码不会无意或以其他方式更改所选参数的数据。有谁知道这样做的不麻烦的方法,或者同样重要的是,这是否是一个不切实际的期望?
我正在使用 R2015b。
P.S. 我在网上搜索过并找到了各种相关文章,例如:
http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data (我需要澄清才能完全理解,但这不是我现在的首要任务)
但是,我不认为我过早地进行了优化。我 知道 我不想修改 table。我只需要一种方法来强制执行它,而不必像创建包装器那样经历扭曲 class.
我已将此张贴在:
*
在 MATLAB 中无法使变量成为常量,除非创建具有常量(和静态?)成员变量的 class。但即便如此你也可以这样做:
t = const_table_class.table;
t(1,1) = 0; % Created and modified a copy!
函数不需要将其输入标记为 const 的原因是因为参数始终按值传递。因此,本地修改不会修改调用者工作区中的数据。 const
是 MATLAB 语言中不存在的东西。
另一方面,您可以确定您的数据不会被您调用的任何函数修改。因此,只要拥有表的函数不修改它们,它们就会保持不变。您将这些表传递给的任何函数,如果它们试图修改它们,它们将创建一个要修改的本地副本。这只是局部问题。此副本使用的内存将在函数退出时释放。这将是函数中的错误,但不会影响此函数之外的代码。
您可以定义一个包含 table 的句柄 class 作为它的属性。定义一个 property set listener
,当 属性 的值发生变化时触发并生成 error/warning。
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;