3

背景

我打算一次创建大量的Matlabtable对象,这样我就可以快速重复引用它们的内容。我的理解是每个表变量/列都以写时复制的方式处理。也就是说,如果函数没有修改表列,则不会创建新副本。

根据我对 1.5 年前 C++ 的回忆,我可以确保函数的代码不会通过使用恒定正确性形式来修改其参数的数据。

具体问题

这些天我没有使用 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 (我需要澄清一下才能完全理解,但这不是我现在的首要任务)

但是,我不相信我过早地进行了优化。我知道我不想修改表格。我只需要一种方法来强制执行它,而不必经历像创建包装类这样的扭曲。

我已将其发布在:* Stack Overflow * Google 群组

4

2 回答 2

3

在 MATLAB 中没有办法使变量成为常量,除非创建一个具有常量(和静态?)成员变量的类。但即使那样你也可以这样做:

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

函数不需要将其输入标记为 const 的原因是因为参数总是按值传递。因此,本地修改不会修改调用者工作区中的数据。const是 MATLAB 语言中不存在的东西。

另一方面,您可以确定您调用的任何函数都不会修改您的数据。因此,只要拥有表的函数不修改它们,它们就会保持不变。您将这些表传递给的任何函数,如果它们试图修改它们,它们将创建一个要修改的本地副本。这只是局部问题。此副本使用的内存将在函数退出时释放。这将是函数中的一个错误,但不会影响此函数之外的代码。

于 2018-11-25T02:39:09.230 回答
1

您可以定义一个包含表的句柄类,因为它是 preperty。定义property set listener在属性值更改时触发并生成错误/警告的 a。

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;
于 2018-11-25T06:23:57.247 回答