Я пытаюсь провести интересный эксперимент с использованием 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? (Это нормально, если я не могу использовать оператор присваивания '=', и это нормально, если ему нужно вызвать другие методы).
Я стараюсь понять ваш код, ваше описание содержит только одну переменную состояния, в то время как ваш код имеет два. Далее, пожалуйста, опишите проблему с вашим кодом. Вы вызываете (последовательность) методов, и в какой-то момент вы не получите ожидаемого значения. Не могли бы вы привести пример, включая то, что вы получаете, и то, что вы ожидаете. – Daniel
Вторая переменная состояния заключалась в том, чтобы сохранить «истинную» переменную состояния неизвестной вызывающей функции (я действительно забыл Access = private в функции true). Когда вызывающая функция получает состояние Observed, истинное состояние изменяется до того, как будет восстановлено наблюдаемое состояние. В моем исходном коде наблюдаемое состояние будет сохранять одно и то же значение без изменения состояния (например, 1,1,1,1,1). Я ожидал, что наблюдаемое состояние изменится с каждым вызовом (например, 0,1,0,1,0,1,0,1). – Trashman