0

我正在尝试使用 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,它将确保其中的两个qparticles 始终处于相反的状态,但该代码不是必需的。

我想我明白这里发生了什么,当我调用 getter 时,对象是“按值”传递的——它的副本将传递给 getter,所以当我发表声明时obj.spinstate = ~obj.spinstate,obj 的本地副本是修改,但它不会传回调用该函数的 obj,因此位的翻转不会回到父对象。

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

我怎样才能在对象中有一个方法基本上同时执行 set/get?(如果我不能使用赋值运算符'='也可以,如果它必须调用其他方法也可以)。

4

1 回答 1

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
于 2015-11-09T18:04:50.397 回答