如何在没有迭代步骤的情况下在这个Matlab程序中运行多个试验?

时间:2012-01-04 01:37:32

标签: matlab vector parallel-processing

我有一个简单的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 个答案:

答案 0 :(得分:2)

我会使用受integral images启发的技巧:

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秒。