Matlab调用setter里面的getter

时间:2015-11-09 17:44:45

标签: matlab oop quantum-computing

我正在尝试使用Matlab进行有趣的实验。这里的目标是用简单的二元模型模拟一对量子纠缠粒子(暂时忽略“未知”或“叠加”状态)。这不是寻找物理建议,我知道这是对量子比特的粗略过度简化。我想模拟粒子的一个特定方面/过程。

正在建模的过程是这样的:每当你试图“读取”粒子的状态时,你也会改变粒子的状态。在这种情况下,我只是建模两个纯态,0和1.这导致了一个有趣的编程问题,我无法在不破坏传统编程智慧的情况下看到这种模型的方法,或者根本没有。这是我第一次尝试的来源:

classdef qparticle
%qparticle class
%   models spin state of one of two particles in a quantum entangled pair

properties
   observed_spin_state;
end

properties (Hidden = true)
    spinstate = [];
end

methods

    function obj = qparticle(initspin)
        if islogical(initspin)
            obj.spinstate = initspin;
        else
            obj.spinstate = NaN;
        end
    end

    function value = get.observed_spin_state(obj)
        %Getting spin state changes spinstate
        obj.spinstate = ~obj.spinstate;
        value = obj.spinstate;
    end

    %% set.spinstate should be private, only callable by getspinstate
    function obj = set.spinstate(obj, value)
        if islogical(value)
            obj.spinstate = value;
        else
            obj.spinstate = NaN;
        end
    end

end

end

我有一个总体课程qpair,它将确保其中的两个qparticle始终处于相反状态,但该代码不是必需的。

我想我明白这里发生了什么,当我调用getter时,对象正在“按值”传递 - 它的副本将转到getter,所以当我发出语句时{{1} },obj的本地副本被修改,但它不会传递回调用该函数的obj,因此该位的翻转不会返回到父对象。

如果我使用setter,一个句柄类或其他返回对象本身的函数,那么我无法将实际值返回给调用函数(我认为)。

如何在对象中使用单个方法基本上执行set / get? (如果我无法使用赋值运算符'=',则可以,如果必须调用其他方法,则可以。)

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了。使用句柄类,我可以传递一个值并引用原始对象。

classdef qparticle < handle
    %qparticle class
    %   models spin state of one of two particles in a quantum entangled pair

    properties
       observed_spin_state;
    end

    properties (Hidden = true, Access = private)
        spinstate = [];
    end

    methods

        function obj = qparticle(initspin)
            if islogical(initspin)
                obj.spinstate = initspin;
            else
                obj.spinstate = NaN;
            end
        end

        function value = get.observed_spin_state(obj)
            %Getting spin state changes spinstate
            obj.spinstate = ~obj.spinstate;
            value = obj.spinstate;
        end

        %% set.spinstate should be private, only callable by getspinstate
        function [] = set.spinstate(obj, value)
            if islogical(value)
                obj.spinstate = value;
            else
                obj.spinstate = NaN;
            end
        end

    end

end