Что ближе всего к #define в Matlab? - PullRequest
11 голосов
/ 26 февраля 2010

В C я мог бы сделать что-то вроде этого:

#define MAGIC_NUMBER (88)

int foo(int a, int b, int c) {
  return a + b + c + MAGIC_NUMBER;
}

double bar(double x, double n) {
  return x + n + MAGIC_NUMBER;
}

/*
 * ...and so on with many kind-of-long functions using
 * MAGIC_NUMBER instead of writing a literal 88 like so:
 */

double bar(double x, double n) {
  return x + n + 88;
}

Что мне делать в Matlab?(Необходимо работать с несколькими файлами.)

Ответы [ 4 ]

5 голосов
/ 26 февраля 2010

Вы можете определить глобальную переменную или объявите функцию, которая просто возвращает постоянное значение (вторая возможность выглядит лучше).

2 голосов
/ 26 февраля 2010

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

f00 = 88;

очевидно работает. Но это не будет видно внутри других функций. Таким образом, вы можете определить ее как глобальную переменную, но тогда вам нужно объявить каждую переменную как глобальную внутри каждой функции, которая в этом нуждается. Мне это кажется клуджем. Немного лучше ИМХО, это определить m-файл функции для foo.

function returnvalue = f00
% returns the scalar value of 88
returnvalue = 88;

(Обратите внимание, что у меня есть строка комментария. Она возвращается, когда вы также вызываете help foo, lookfor также увидит эту строку. Лучше справка, чем рекомендуется, но сейчас мне лень). *

Пока foo.m находится в вашем пути поиска, это всегда возвращает значение 88. Обратите внимание, что я не включил аргументы. Но вы могли бы быть более креативными и, возможно, позволить аргумент размера, чтобы foo (N) вел себя так же, как нули, единицы и глаза. Это хорошая вещь об использовании функции здесь. Это может сделать именно так, как вы хотите. Так что, возможно ...

function returnvalue = f00(varargin)
% returns the scalar value of 88, or replicated elements if a size is supplied
% usage: foo
% usage: foo(N)
% usage: foo(N1,N2,...)
%
% arguments: 
%  N - a scalar or vector that denotes the number
%      of repeated elements (all 88) to be generated
%
%  returnvalue - a scalar (or vector/array) of
%      size indicated by N.
%
% see also: ones, zeros, eye

if (nargin == 0)
  % no arguments, so return a scalar 88
  returnvalue = 88;
elseif (nargin == 1) && isscalar(varargin{1})
  % be consistent with ones, zeros, eye, etc.
  returnvalue = repmat(88,[varargin{1},varargin{1}]);
elseif (nargin == 1)
  % the size is a vector already
  if isvector(varargin{1})
    returnvalue = repmat(88,varargin{1});
  else
    error('FOO:impropersize','Size argument cannot be a general array')
  end
elseif 
  % nargin must have been more than 1
  returnvalue = repmat(88,cell2mat(varargin));
end

Возможно, я мог бы сделать чуть лучше проверку ошибок выше, но вы должны получить общее представление.

1 голос
/ 07 сентября 2017

Локальная функция, такая как AVB, говорит, что это хорошо, и ее можно сделать более долговечной, используя постоянные переменные вместо глобальных. Постоянные переменные не могут быть отредактированы или просмотрены вне файла m, поэтому это немного больше похоже на использование #define в верхней части файла .c.

function ver = version( ver )
% #define version = 'something'
% returns '' if not set since last time m file was edited, els persistently
% returns the last value set

persistent ver_;

if nargin
    ver_ = char(ver);  % garentee the data type
else
    ver_ = char(ver_);  % garentee the data type
end

ver = ver_;

end

Первая строка в родительской функции установит версию

version('6.00'); % version number of the current converter

И где угодно в том же файле .m, я хочу использовать этот эквивалент #define, я могу ссылаться на него, как на переменную.

myMat.convertVersion = version

1 голос
/ 26 февраля 2010

Я второй ответ AB, объявляю функцию, которая просто возвращает постоянное значение.

Другая возможность состоит в том, чтобы просто #define все, что вы хотите, и предварительно обработать ваши .m файлы с помощью cpp. Тогда, однако, вы теряете интерактивный характер развития Matlab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...