MATLAB Как изменить свойство класса значения из метода в классе, который находится в исходном классе? - PullRequest
0 голосов
/ 04 января 2019

Я хотел бы создать класс, который хранит и может изменять вектор.Выглядит примерно так:

classdef vect3d
      properties
            vec
            rotate
      end

      methods
            function obj = vec3d(a,b,c)
                  vec = [a,b,c];
                  rotate = rot(obj) ;
            end
      end
end

У меня есть другой класс с именем rot;который имеет функции для вращения векторов.То, что я хотел бы сделать, это:

MyVec = vec3d([1;2;3]);
MyVec2 = MyVec;

% Define a Directional cosine matrix to rotate the vector
MyDCM = ... ;

MyVec.rotate.byDCM(MyDCM) ;
% MyVec should now contain the rotated vector
% MyVec2 should remain as the original vector

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

Я хотел бы передать указатель на мою переменную классу rot, чтобы я мог манипулировать им в функциях класса rot.

Короче говоря: я хочу иметь возможностьиспользуйте

MyVec.rotate.byDCM( MyDCM)

для изменения MyVec, фактически не создавая его копию в памяти.Я хочу, чтобы DCM был методом внутри rotate, а не MyVec.И я хотел бы иметь возможность безопасно копировать мою переменную.

Надеюсь, я четко объяснил.Спасибо за ваше время.

1 Ответ

0 голосов
/ 04 января 2019

Вы хотите сделать

MyVec = rotate.byDCM(MyVec, MyDCM);

Единственный способ изменить переменную, переданную в функцию, - это если это класс дескриптора, но тогда вы не сможете сделать глубокую копию с * 1004.*.

Если функция rotate.byDCM реализована следующим образом:

function vec = byDCM(vec, DCM)
   % modify vec here

, тогда MATLAB оптимизирует все, чтобы vec никогда не копировался.Обратите внимание, что в определении функции одно и то же имя переменной отображается в списке ввода и вывода.При вызове функции та же самая переменная (MyVec), которая передается в качестве этого аргумента, также получает выходные данные.Интерпретатор MATLAB понимает это и позволяет функции изменять переменную на месте.

Ссылка: https://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/

...