Можете ли вы предварительно выделить массив случайного размера? - PullRequest
0 голосов
/ 14 октября 2018

Основная часть кода, о котором идет речь, может быть преобразована в:

list=rand(1,x); % where x is some arbitrarily large integer
hitlist=[];
for n=1:1:x
    if rand(1) < list(n)
        hitlist=[hitlist n];
    end
end
list(hitlist)=[];

Эта программа работает довольно медленно, и я подозреваю, что именно поэтому, однако я не знаю, как это исправить.Длина hitlist обязательно будет меняться случайным образом, поэтому я не могу просто предварительно выделить «нули» нужного размера.Я подумывал сделать hitlist a zeros длины моего списка, но тогда мне пришлось бы удалить все лишние нули, и я не знаю, как это сделать, не столкнувшись с той же проблемой.

Как я могу предварительно выделить массив случайного размера?

1 Ответ

0 голосов
/ 14 октября 2018

Я не уверен в предварительном распределении «случайного размера», но вы можете предварительно распределить его большими кусками, например, 1e3, или, тем не менее, полезно для вашего случая использования:

list=rand(1,x); % where x is some arbitrarily large integer
a = 1e3; % Increment of preallocation
hitlist=zeros(1,a);
k=1; % counter
for n=1:1:x
    if rand(1) < list(n)
        hitlist(k) = n;
        k=k+1;
    end
    if mod(k-1,a)==0 % if a has been reached
        hitlist = [hitlist zeros(1,a)]; % extend
    end
end
hitlist = hitlist(1:k-1); % trim excess
% hitlist(k:end) = []; % alternative trim, but might error
list(hitlist)=[];

Это не будетмаксимально быстрый, но, по крайней мере, намного быстрее, чем увеличение каждой итерации.Убедитесь, что выбрали a подходящий;вы можете даже основать его как-то на доступном объеме оперативной памяти, используя memory, и впоследствии обрезать излишки, так что вам вообще не придется выполнять трюк в цикле.


В качестве отступления: MATLAB работает на уровне столбцов, поэтому работа с матрицами выполняется быстрее.Т.е. сначала первый столбец, потом второй и тд.Для одномерного массива это не имеет значения, но для матриц это имеет значение.Поэтому я предпочитаю использовать list = rand(x,1), то есть в качестве столбца.

В этом конкретном случае не использовать этот циклический подход в любом случае, но использовать логическое индексирование :

list = rand(x,1);
list = list(list<rand(size(list)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...