Как запустить несколько испытаний в этой программе Matlab без шага итерации? - PullRequest
0 голосов
/ 04 января 2012

У меня есть простая программа Matlab, которая использует набор списков случайных чисел и запускает серию испытаний с использованием этих чисел.В настоящее время испытания проводятся итеративно с использованием приведенного ниже кода. Как этот код можно изменить, чтобы устранить необходимость в этом итеративном шаге?Программа была бы намного более эффективной, если бы ее можно было правильно векторизовать.

size = 1000;
trials = 1000;

grid = zeros(size,size);


rx1 = randi(size,trials,1);
ry1 = randi(size,trials,1);
rx2 = randi(size,trials,1);
ry2 = randi(size,trials,1);

xmin = min(rx1,rx2);
xmax = max(rx1,rx2);
ymin = min(ry1,ry2);
ymax = max(ry1,ry2);

%This is the loop that I want to eliminate
for n=1:trials;
    grid(ymin(n):ymax(n),xmin(n):xmax(n)) = grid(ymin(n):ymax(n),xmin(n):xmax(n)) + 1;
end

figure
mesh(grid);

1 Ответ

2 голосов
/ 04 января 2012

Я бы использовал трюк, вдохновленный интегральными изображениями :

grid(ymin(n):ymax(n),xmin(n):xmax(n))=1;

эквивалентен:

grid(ymin(n),xmin(n))=1;
grid(ymin(n),xmax(n)+1)=-1;
grid(ymax(n)+1,xmin(n))=-1;
grid(ymax(n)+1,xmax(n)+1)=1;
grid=cumsum(cumsum(grid,1),2);

Так что для вашей проблемы я бы сделал:

grid = zeros(size+1,size+1);
grid=full( sparse(ymin,xmin,1,size+1,size+1)...
      +sparse(ymax+1,xmax+1,1,size+1,size+1)...
      -sparse(ymin,xmax+1,1,size+1,size+1)...
      -sparse(ymax+1,xmin,1,size+1,size+1));
grid=cumsum(cumsum(grid,1),2);
grid=grid(1:end-1,1:end-1);

Я проверил это на своем ноутбуке.Результаты такие же:

Истекшее время для кода с циклом составляет 1,802788 секунд.

Истекшее время для векторизованного кода составляет 0,033834 секунды.

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