我有一个简单的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);
答案 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秒。