2015-11-09 34 views
0

我正在嘗試使用Matlab的一個有趣的實驗。這裏的目標是用一個簡單的二元模型來模擬一對量子糾纏粒子(暫時忽略「未知」或「疊加」狀態)。這不是尋找物理學建議,我知道這是一個量子位的過度簡化。我想模擬粒子的一個特定方面/過程。Matlab調用setter內部getter

被建模的過程是這樣的:每當你試圖「讀」粒子的狀態,你也改變粒子的狀態。在這種情況下,我只是建模了兩個純態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 s爲總是處於相反的狀態,但該代碼不需要這個。

我想我理解這裏發生了什麼,當我調用getter時,對象被「按值」傳遞 - 它的一個副本將傳遞給getter,所以當我發表聲明obj.spinstate = ~obj.spinstate時, obj的本地副本被修改,但它不會被傳遞迴調用該函數的obj,因此該位的翻轉不會返回到父對象。

如果我使用setter,句柄類或其他函數返回對象本身,那麼我沒有辦法將實際值返回給調用函數(我認爲)。

我該如何在對象中使用單一方法本質上同時執行set/get? (如果我不能使用賦值運算符'=',那麼可以,如果它必須調用其他方法,那麼也可以)。

+0

我很難理解你的代碼,你的描述只包含一個狀態變量,而你的代碼有兩個。此外,請描述您的代碼問題。你正在調用(一系列)方法,並且在某些時候你沒有得到預期的值。你能否舉個例子,包括你得到的和你期望的。 – Daniel

+0

第二個狀態變量是保持調用函數未知的「真實」狀態變量(我在真實函數中忘記了Access = private)。當調用函數獲得觀察狀態時,則在返回觀察狀態之前修改真實狀態。在我的原始代碼中,觀察狀態將保持返回相同的值而不改變狀態(例如1,1,1,1,1)。我期望的是觀察狀態會隨着每個呼叫而改變(例如0,1,0,1,0,1,0,1)。 – Trashman

回答

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