Понимание кода Matlab неоднородного процесса Пуассона

Я нашел следующий код Matlab для моделирования неоднородного процесса Пуассона.

function x = nonhomopp(intens,T)
% example of generating a 
% nonhomogeneousl poisson process on [0,T] with intensity function intens

x = 0:.1:T;
m = eval([intens 'x']);
m2 = max(m); % generate homogeneouos poisson process
u = rand(1,ceil(1.5*T*m2));
y = cumsum(-(1/m2)*log(u)); %points of homogeneous pp
y = y(y<T); n=length(y); % select those points less than T
m = eval([intens 'y']); % evaluates intensity function
y = y(rand(1,n)<m/m2); % filter out some points
hist(y,10)

% then run
% t = 7 + nonhomopp('100-10*',5)

Я новичок в Matlab и не понимаю, как это работает. Я прочитал страницы Mathworks по всем этим функциям и запутался в четырех местах:

1) Почему функция определяется как x, а интервалы также называются x? Как это злоупотребление обозначениями?

2) Как квадратные скобки влияют на eval,

eval([intens 'x'])

а почему x в одинарных кавычках?

3) Почему они используют cumsum вместо sum?

4) Данная функция интенсивности \lambda (t) = 100 - 10*(t-7) with 7 \leq t \leq 12 Как это представляет t = 7 + nonhomopp('100-10*',5)?

Извините, если так много, спасибо!


person Sunhwa    schedule 13.02.2016    source источник
comment
Это действительно странный фрагмент кода. Есть ли у вас какие-либо входные данные, которые заставляют функцию работать без сообщения об ошибке?   -  person Daniel    schedule 13.02.2016
comment
Да, @Daniel, когда я запускаю его, я получаю сообщение об ошибке, но затем запуск t = 7 + nonhomopp('100-10*',5) создает гистограмму   -  person Sunhwa    schedule 13.02.2016


Ответы (2)


  1. функция не определена как x: x — это просто выходная переменная. В Matlab функции объявлены как function [output variable(s)] = <function name>(input variables). Если функция имеет только один выход, квадратные скобки можно опустить (как в вашем случае). Вместо этого скобки вокруг входных аргументов являются обязательными, независимо от того, сколько входных аргументов имеется. Также рекомендуется заканчивать тело функции символом end, точно так же, как вы делаете это с циклами и операторами if/else.
  2. eval работает со строкой в ​​качестве входных данных, а квадратные скобки, по-видимому, объединяют строку 'intens' со строкой 'x'. x находится в кавычках, потому что, опять же, eval работает с вводом в строковом формате, даже если он относится к переменным.
  3. cumsum и sum действуют по-разному. sum возвращает скаляр, представляющий собой сумму всех элементов массива, тогда как cumsum возвращает другой массив, содержащий совокупную сумму. Если наш массив равен [1:5], sum([1:5]) вернет 15, потому что это 1+2+3+4+5. Вместо этого cumsum([1:5]) вернет [1 3 6 10 15], где каждый элемент выходного массива представляет собой сумму предыдущих элементов (включая его самого) из входного массива.
  4. то, что возвращает команда t = 7 + nonhomopp('100-10*',5), является просто значением времени t, а не значением лямбда, действительно, глядя на t, минимальное значение равно 7, а максимальное значение равно 12. Само распределение Пуассона возвращается через гистограмму.
person AlessioX    schedule 13.02.2016
comment
Спасибо @Alessiox; Я думаю, что я понимаю код лучше! И последнее, почему, когда я пытаюсь nonhomopp('10*-100',5), это не сработает? Так что, если бы у нас была функция интенсивности, такая как x^2+x+10, как бы она оценивалась? - person Sunhwa; 13.02.2016
comment
Вы должны внимательно следить за командой eval. Команда eval объединяет строку, которую вы вводите в качестве первого ввода, со строкой x. В этом новом случае вы объединяете '10*-100x', но это недопустимая команда в синтаксисе Matlab. Даже если вы попытаетесь запустить его обычным способом вместо eval, синтаксис будет неверным. 10* ничего не значит, у этого умножения нет второго аргумента. Также 100x недопустимо, потому что в Matlab вы должны явно записывать * при оценке умножения. - person AlessioX; 13.02.2016
comment
Что касается новой функции интенсивности, которую вы предлагаете, это выражение нелегко соединить и передать в eval. Также это зависит, опять же, от того, что вы передаете своей функции в качестве первого входного параметра. Этот ввод должен быть объединен в eval... это ключ. Для более сложных функций интенсивности я рекомендую ответ @Daniel с анонимными функциями. - person AlessioX; 13.02.2016
comment
Никогда не используйте eval. Следуйте предложению Дэниела об анонимных функциях - person Adriaan; 13.02.2016

к ответу 2). Это ненужный сложный фрагмент кода. Чтобы понять это, оцените только квадратные скобки и их содержимое. В результате получается строка 100-10*x, которая затем оценивается. Вот версия без eval, вместо которой используется анонимная функция. Вот так это должно было быть реализовано.

function x = nonhomopp(intens,T)
% example of generating a 
% nonhomogeneousl poisson process on [0,T] with intensity function intens

x = 0:.1:T;
m = intens(x);
m2 = max(m); % generate homogeneouos poisson process
u = rand(1,ceil(1.5*T*m2));
y = cumsum(-(1/m2)*log(u)); %points of homogeneous pp
y = y(y<T); n=length(y); % select those points less than T
m = intens(y); % evaluates intensity function
y = y(rand(1,n)<m/m2); % filter out some points
hist(y,10)

Что можно так назвать

t = 7 + honhomopp(@(x)(100-10*x),5)
person Daniel    schedule 13.02.2016
comment
Спасибо @Daniel, этот код имеет гораздо больше смысла! Я хотел бы принять оба ответа, так как это так же полезно ›.‹ - person Sunhwa; 13.02.2016