Как эффективно создать большие случайные векторы, не прибегая к циклам? - PullRequest
5 голосов
/ 06 июля 2010

Постановка задачи: - Я хочу создать 50 экземпляров вектора (1 измерение), который содержит случайные действительные числа (с плавающей точкой). Размер массива (1 измерение) будет, скажем, 30 тысяч. Как мне поступить так, чтобы издержки были минимальными или сложность минимальной?

Ответы [ 2 ]

4 голосов
/ 06 июля 2010
N = 30000; %// length of your vectors
I = 50; %// number of instances
v = rand(I, N); 

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

Если вам нужно создать каждый экземпляр отдельно, используйте цикл:

for i=1:I
    v = rand(1, N);
    %// do something with v
end

Но я бы не использовал это на вашем месте (это медленнее и ИМХО менее понятно).

EDIT :
Относительно вашего вопроса под ответом Мау:
Нет, вам не нужно индексировать его самостоятельно. Пусть Матлаб сделает это за вас.
Например, если вам нужно повторить следующую операцию 50 раз:

 x1 = sigma*y + beta * vect1;
 ...
 x50 = sigma*y + beta * vect50;

при условии, что y - это вектор размером 1x30000, вы можете вычислить его в одну строку:

X = sigma*repmat(y, 50, 1) + beta * rand(50, 30000);

Объяснение: каждая строка представляет собой один вектор, который вы хотите вычислить:

X(1,:) = x1;
...
X(50,:) = x50;

repmat(y,50,1) повторяет ваш y вектор 50 раз в первом измерении (строки)

4 голосов
/ 06 июля 2010

Создание матрицы случайных значений 50x30k

values = rand(50, 30000)

тогда каждая строка будет случайным вектором со значениями 30k

 aVector = values(3,:)  % Row 3, all columns
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...