Matlab class несколько аксессоров для одних и тех же данных - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь перевести класс из C ++ в Matlab. В C ++ одни и те же данные могут быть доступны несколькими способами, потому что значения объявлены как union.

Однако, похоже, что единственный способ сделать это в Matlab - переопределить subsref и subsasgn, что открывает червь необходимости разбирать методы.

Есть ли другой способ справиться с этим? Я видел некоторые комментарии от 2014 года, указывающие, что не было

Это C ++ enum в вопросе:

template <class T>
class Euler
{
    public:
       union
       {
          T m[3];
          struct
          {
             union { T x; T yaw; T psi; };       // m[0]
             union { T y; T pitch; T theta; };   // m[1]
             union { T z; T roll; T phi; };      // m[2]
          };
       };
};

1 Ответ

2 голосов
/ 27 июня 2019

Простое решение: забудьте об этих именах и переведите этот класс в простой массив, индексируя m.x как m[1], m.roll как m[2] и т. Д. Это может не подойти для некоторых случаев использования,но, безусловно, является наиболее эффективным решением.

Альтернативное решение требует создания пользовательского класса.subsref и subsasgn не обязательны, возможно объявить зависимые свойства и определить методы получения и установки (хотя это не красиво!):

classdef Euler
    properties
       x = 0;
       y = 0;
       z = 0;
    end
    properties (Dependent)
       yaw, pitch, roll;
       psi, theta, phi;
    end
    methods
        function value = get.yaw(obj)
            value = obj.x;
        end
        function value = get.pitch(obj)
            value = obj.y;
        end
        function value = get.roll(obj)
            value = obj.z;
        end
        function obj = set.yaw(obj,value)
            obj.x = value;
        end
        function obj = set.pitch(obj,value)
            obj.y = value;
        end
        function obj = set.roll(obj,value)
            obj.z = value;
        end
        % Add same methods for psi, theta, phi.
    end
end

Теперь вы можете сделать:

e = Euler;
e.x = 1;
e.yaw    % returns 1
e.roll = 5;
e.z      % returns 5

То есть объект имеет свойства x, y, z, yaw, pitch и roll (и после добавления соответствующих установщиков и получателей также psi, thetaи phi), но хранит только три значения.Например, значения yaw и x связаны между собой и всегда идентичны.

...