2015-11-09 2 views
0

Я пытаюсь провести интересный эксперимент с использованием Matlab. Целью здесь является модель пары квантовых запутанных частиц с простой двоичной моделью (на данный момент игнорируется состояние «неизвестное» или «суперпозиция»). Это не ищет совета по физике, я знаю, что это грубое упрощение кубита. Я хочу моделировать один конкретный аспект/процесс частицы.Matlab call 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 внутри него всегда находятся в противоположных состояниях, но этот код не является необходимым для этого.

Я думаю, что я понимаю, что здесь происходит, что, когда я вызываю геттер, объект передается «по значению» - его копия идет к получателю, поэтому, когда я делаю оператор obj.spinstate = ~obj.spinstate, локальная копия obj модифицирована, но она не возвращается обратно в объект obj, который вызывает функцию, поэтому переброска бит не возвращается к родительскому объекту.

Если я использую сеттер, класс дескриптора или другую функцию, которая возвращает сам объект, то у меня нет способа вернуть фактическое значение вызывающей функции (я думаю).

Как я могу использовать единственный метод в объекте, который выполняет как набор/get? (Это нормально, если я не могу использовать оператор присваивания '=', и это нормально, если ему нужно вызвать другие методы).

+0

Я стараюсь понять ваш код, ваше описание содержит только одну переменную состояния, в то время как ваш код имеет два. Далее, пожалуйста, опишите проблему с вашим кодом. Вы вызываете (последовательность) методов, и в какой-то момент вы не получите ожидаемого значения. Не могли бы вы привести пример, включая то, что вы получаете, и то, что вы ожидаете. – Daniel

+0

Вторая переменная состояния заключалась в том, чтобы сохранить «истинную» переменную состояния неизвестной вызывающей функции (я действительно забыл Access = private в функции true). Когда вызывающая функция получает состояние Observed, истинное состояние изменяется до того, как будет восстановлено наблюдаемое состояние. В моем исходном коде наблюдаемое состояние будет сохранять одно и то же значение без изменения состояния (например, 1,1,1,1,1). Я ожидал, что наблюдаемое состояние изменится с каждым вызовом (например, 0,1,0,1,0,1,0,1). – Trashman

ответ

0

Я понял это. С классом handle я могу как передать значение, так и ссылаться на исходный объект.

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