У меня есть вектор, который определяется a=[1000 1000 1000 1000 1000];. Меня просят добавить равномерный шум в интервале [-9,9], но при этом сумма всех элементов сохраняется на уровне 5000. Как я могу это сделать? Заранее спасибо.

0
A Doe 18 Сен 2018 в 03:33

2 ответа

Лучший ответ

Вы можете добавить равномерный случайный шум с помощью rand. Из документации Matlab:

В общем, вы можете сгенерировать N случайных чисел в интервале (a, b) с помощью формулы r = a + (b-a). * Rand (N, 1).

vec = [1000 1000 ... 1000];
noise = -9 + 18 * rand(size(vec));

Затем вам нужно центрировать шум около 0:

noise = noise - mean(noise);

Наконец, вы добавляете его к начальному вектору:

vec = vec + noise;

Например:

>> vec = [1000 1000 1000 1000 1000];
>> noise = -8 + 18 * rand(size(vec));       
>> vec_noise = vec + noise - mean(noise)

vec_noise =

   1.0e+03 *

    1.0002    0.9968    1.0021    0.9988    1.0020

>> sum(vec_noise)

ans =

        5000
2
TwistedSim 18 Сен 2018 в 12:33

Я знаю, что это не изящный способ, но вы можете нарисовать шум для каждого элемента вектора в цикле, проверить сумму предыдущего шума и возможные максимумы и минимумы оставшихся шумов. Если ваш текущий шум + сумма предыдущего шума превышает возможный оставшийся диапазон, нарисуйте снова (в новом диапазоне). Шум последнего элемента должен быть установлен так, чтобы сумма шума была равна нулю.

1
p.osinski 18 Сен 2018 в 07:40