В MATLAB, как генерировать случайные числа в зависимости от данных? - PullRequest
1 голос
/ 04 декабря 2010

Например, если Ax = 0.0023, он должен добавить к нему некоторый шум и произвести newAx = 0.0027 Если Hy = 94.54, то newHy = 93.42.Сначала я начал использовать rand в MATLAB следующим образом:

newAx = Ax + rand
newAx = 0.9453

Это очень далеко от параметра Ax(0.0023), который у меня есть.В этом случае мы должны использовать мин и макс Ax.Это также вводит проблемы, как это далеко от ценностей.У меня есть система, в которой Ax является постепенно увеличивающимся параметром в каждый момент времени.Теперь в любой момент, в зависимости от значения Ax, я должен генерировать некоторый случайный шум, чтобы получить newAx, который почти близок к Ax.Пример, если Ax = 0.0023 генерирует newAx = 0.0027, а не newAx = 0.4590

Мне нужно создать случайный шум, который зависит от самих данных.

Ответы [ 3 ]

3 голосов
/ 04 декабря 2010

Один из способов сделать это - использовать RANDN для генерации нормально распределенных значений шума, а затем масштабировать стандартное отклонение шума в процентах от значения данных:

noiseScale = 0.05;  %# Noise with a standard deviation of %5 of the data
newAx = Ax + noiseScale*Ax*randn;

И если Ax является вектором значений, к которым вы хотите добавить шум, вы можете сделать это:

newAx = Ax + noiseScale.*Ax.*randn(size(Ax));

Если вы хотите убедиться, что newAx остается в пределахВ конкретном диапазоне значений можно использовать функции MAX и MIN , например:

newAx = min(newAx,maxValue);  %# Clip newAx to a maximum of maxValue
newAx = max(newAx,minValue);  %# Clip newAx to a minimum of minValue
2 голосов
/ 04 декабря 2010
newDatum = oldDatum+2*(rand(1)-0.5)*oldDatum
1 голос
/ 04 декабря 2010

Какой "шум" вы пытаетесь смоделировать?

rand (1) дает вам равномерное случайное число в диапазоне 0 Uniform " означает, что каждое значение одинаково вероятно, подобно броску одного идеального кубика.

Другими словами, случайное значение имеет диапазон +/- 0,5 с центром около 0,5. Вы хотите сосредоточиться вокруг своего фактического значения, и вы можете масштабировать диапазон в зависимости от фактического значения. например,

 2 * (rand(1) - 0.5) 

дает вам случайные случайные числа в диапазоне -1


Например, если шум не должен превышать 1%, вам необходимо использовать:

newValue = oldValue * ( 1 +  2*(rand(1) - 0.5) * 0.01)

0,01 - это шкала (1%), которую я использовал для примера, 1 + ... центрируется вокруг исходного значения.


Многие процессы не имеют равномерного распределения. Распространенным распределением для случайного шума (такого как шум датчика) является нормальное распределение , где значения, близкие к центру, более вероятны, чем значения, удаленные от центра.

Matlab поддерживает randn () для нормального распределения.

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

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