Константы в MATLAB

Я действительно наслаждаюсь Код и asp.netPRO... Visual Studio так себе.

39
задан chappjc 20 October 2013 в 00:20
поделиться

4 ответа

Обычно я просто определяю переменную с помощью UPPER_CASE и помещаю ее в начало файла. Но вы должны ответственно относиться к тому, чтобы не изменять его значение.

В противном случае вы можете использовать классы MATLAB для определения именованных констант.

20
ответ дан 27 November 2019 в 02:36
поделиться

В Matlab теперь есть константы. Новый (R2008a +) стиль "classdef" ООП Matlab позволяет вам определять свойства константных классов. Это, вероятно, лучший вариант, если вам не требуется обратная совместимость со старыми Matlabs. (Или, наоборот, это хорошая причина отказаться от обратной совместимости.)

Определите их в классе.

classdef MyConstants
    properties (Constant = true)
        SECONDS_PER_HOUR = 60*60;
        DISTANCE_TO_MOON_KM = 384403;
    end
end

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

>> disp(MyConstants.SECONDS_PER_HOUR)
        3600

См. Документацию Matlab для "Object" -Oriented Programming »в« Руководстве пользователя »для получения всех подробностей.

Есть пара незначительных ошибок. Если код случайно пытается записать в константу, вместо получения ошибки он создает локальную структуру, маскирующую класс констант.

>> MyConstants.SECONDS_PER_HOUR
ans =
        3600
>> MyConstants.SECONDS_PER_HOUR = 42
MyConstants = 
    SECONDS_PER_HOUR: 42
>> whos
  Name             Size            Bytes  Class     Attributes

  MyConstants      1x1               132  struct              
  ans              1x1                 8  double              

Но ущерб локальный. И если хочешь быть внимательным, вы можете защитить от него, вызвав конструктор MyConstants () в начале функции, который заставит Matlab проанализировать его как имя класса в этой области. (IMHO, это перебор, но он есть, если вы этого хотите.)

function broken_constant_use
MyConstants(); % "import" to protect assignment
MyConstants.SECONDS_PER_HOUR = 42 % this bug is a syntax error now

Другая проблема заключается в том, что свойства и методы classdef, особенно такие статики, работают медленно. На моей машине чтение этой константы примерно в 100 раз медленнее, чем вызов простой функции (22 мкс против 0,2 мкс, см. этот вопрос ). Если вы используете константу внутри цикла, скопируйте ее в локальную переменную перед входом в цикл. Если по какой-то причине вы должны использовать прямой доступ к константам, используйте простую функцию, которая возвращает значение.

Ради вашего здравого смысла держитесь подальше от препроцессора.

35
ответ дан 27 November 2019 в 02:36
поделиться

Вы могли бы ответить на некоторые из этих ответов Как мне создать нумерованные типы в MATLAB? полезно. Но вкратце, нет "однострочного" способа указания переменных, значение которых не должно изменяться после начальной установки в MATLAB.

4
ответ дан 27 November 2019 в 02:36
поделиться

Как бы вы это ни делали, это все равно будет своего рода кладжем. В прошлых проектах мой подход к этому заключался в том, чтобы определить все константы как глобальные переменные в одном файле сценария, вызвать сценарий в начале выполнения программы для инициализации переменных и включить "global MYCONST;" операторы в начале любой функции, которая должна использовать MYCONST. Превосходит ли этот подход «официальный» способ определения функции, возвращающей постоянное значение, - вопрос мнения, с которым можно было бы поспорить в любом случае. Ни один из способов не идеален.

2
ответ дан 27 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: