Как определить константу в классе Matlab? - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы создать класс перечисления Matlab с методом поиска значений из таблицы на основе соответствующих числовых значений для каждого перечисления. Вот что у меня есть:

classdef testclass < uint8
    enumeration
        enum1 (1)
        enum2 (2)
        enum3 (3)
    end

    A = [100 200 300;101 202 303;111 222 333];

    methods
        function retval = getval(obj1,obj2)
            retval = testclass.A(obj1,obj2);
        end
    end
end

Пока что пробовал:

  • Не наследовать свойства от uint8 и добавлять блок properties в класс с матрицей A, которой я хотел бы быть константой, и свойством B, которому я хотел бы быть числом, соответствующим каждому перечислению. Я получаю сообщение об ошибке, в котором говорится, что первое перечисление (предположительно, каждое из остальных тоже) имеет слишком много аргументов в своем определении.

  • Код выше. Я получаю сообщение об ошибке в строке с буквой A, говорящей о том, что это неожиданное выражение MATLAB.

  • Не наследовать свойства от uint8 и добавлять два блока properties, поскольку я думаю, что Matlab будет ожидать два аргумента для каждого определения перечисления, если я определю два свойства. Первый блок properties является постоянным, второй не имеет ничего после «свойств». Это тоже не работает.

  • Определение матрицы A внутри функции getval. Это работает, но я бы хотел, чтобы A был доступен другим методам в классе.

Как определить переменную, доступную для каждого метода в классе?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

С другой стороны,

>> en = getval.enum1
>> en.A
ans = 
   1x3 uint16 row vector
   101 202 303
>> en.A*2
ans = 
   1x3 uint16 row vector
   202 404 606

classdef getval
    enumeration
        enum1 (100,200,300)
        enum2 (101,202,303)
        enum3 (111,222,333)
    end
    properties
        A
    end
    methods
        function retval = getval(a,b,c)            
            retval.A = uint16([a,b,c]);
        end
    end
end
0 голосов
/ 28 июня 2018

К сожалению, вы не можете определить свойства унаследованного класса перечисления. Вместо этого вы можете определить функцию над вашим классом перечисления (например, «double»), которая будет возвращать некоторое базовое значение. Затем вы можете использовать это значение для ссылки на константу. Пожалуйста, смотрите следующий пример:

Класс:

classdef testclass
    enumeration
        enum1
        enum2
        enum3
    end
    properties(Constant)
        A = [100 200 300;101 202 303;111 222 333];
    end
    methods
        function retval = getval(obj1,obj2)
            retval = testclass.A(double(obj1),double(obj2));
        end
        function retval = double(obj)
            if obj == testclass.enum1
                retval = 1;
            elseif obj == testclass.enum2
                retval = 2;
            elseif obj == testclass.enum3
                retval = 3;
            end
        end
    end
end

для запуска:

A = testclass.enum1
B = testclass.enum2
getval(A,B)
0 голосов
/ 28 июня 2018

Я вижу три проблемы с вашим кодом.

  1. Я не знаю, важно это или нет, в зависимости от ваших значений в A, но вы не можете представлять числа свыше 255 с помощью uint8; как в 300, 303, 333. Так что вам нужно использовать значения uint16 или меньше внутри матрицы A.
  2. Я не совсем понимаю, почему вы хотите использовать obj1 и obj2 в качестве входных данных. Если вам нужны два аргумента, моё решение нуждается в модификации.
  3. Ваш класс и метод конструктора должны иметь одно и то же имя.

Я думаю, это то, что вы ищете:

>> en = getval.enum1
>> en.a
ans = 
   1x3 uint16 row vector
   101 202 303
>> en.a*2
ans = 
   1x3 uint16 row vector
   202 404 606

classdef getval
    enumeration
        enum1 (1)
        enum2 (2)
        enum3 (3)
    end
    properties
        a
    end

    methods
        function retval = getval(a)            
            A = uint16([100 200 300;101 202 303;111 222 333]);
            retval.a = A(a,:);
        end
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...