Что самая близкая вещь к #define в Matlab?

В 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? (Потребности работать через несколько файлов.)

12
задан Benjamin Oakes 25 February 2010 в 21:54
поделиться

3 ответа

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

6
ответ дан 2 December 2019 в 22:22
поделиться

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

f00 = 88;

очевидно, что это работает. Но она не будет видна в других функциях. Поэтому вы можете определить ее как глобальную переменную, но тогда вам придется объявлять каждую переменную как глобальную в каждой функции, которой она понадобится. На мой взгляд, это выглядит нелогично. Немного лучше, IMHO, определить функцию m-file для 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

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

2
ответ дан 2 December 2019 в 22:22
поделиться

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

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

1
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

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