Algorithm 并行算法:检查一个像素是否被其中一个形状覆盖

Algorithm 并行算法:检查一个像素是否被其中一个形状覆盖,algorithm,matlab,parallel-processing,geometry,Algorithm,Matlab,Parallel Processing,Geometry,在二维空间中有一张地图,坐标在x轴上从leftPos到rightPos,在y轴上从bottomPos到topPos 这张地图上有各种形状:三角形、圆形、正方形。共有N个形状。我试图计数像素,如果它在任何形状内。形状可以重叠,因此可能具有相交区域 我的代码是: % paintedPixel is initialized to all zeroes for i=1:1:N for j=leftPosition:1:rightPosition for k=bottomPos:1

在二维空间中有一张地图,坐标在x轴上从leftPos到rightPos,在y轴上从bottomPos到topPos

这张地图上有各种形状:三角形、圆形、正方形。共有N个形状。我试图计数像素,如果它在任何形状内。形状可以重叠,因此可能具有相交区域

我的代码是:

% paintedPixel is initialized to all zeroes

for i=1:1:N
    for j=leftPosition:1:rightPosition
       for k=bottomPos:1:topPos
           if (isInside(point(j,k), shape(i)) ) 
                paintedPixel[j,k] = 1;

       done
    done
 done
所以我试图并行化这段代码,但只有我能将最后一个改为parfor。 对于s的输出,MATLAB抱怨k不是固定的。我知道一般情况下可能存在竞争条件,但在这种特殊情况下,我只是尝试指定任何形状是否覆盖给定的像素


那么,我的问题是,如何将其并行化?我试图将shape for放到最里面,但MATLAB给出了一个错误,即parfor中的paintexPixel无法分类

当您将代码与parfor进行并行时,您需要能够在工作人员之间分割生成的数组,这样,每个工作者都可以获得自己的输出位,而输出位完全独立于任何其他工作者的位

在您的例子中,所有工作程序都在向相同的像素写入数据,因此对于Matlab来说,哪些像素应该向哪个工作程序写入是不清楚的。因此,出现了错误消息

如果内存可用,可以将
paintedPixel
制作成
jks
数组,这样每个工作进程都可以填写自己的数组,循环完成后就可以合并该数组

paintedPixelPerShape = false(nPosJ, nPosK, N); %# logical for less memory

parfor i=1:1:N
    for j=leftPosition:1:rightPosition
       for k=bottomPos:1:topPos
           if (isInside(point(j,k), shape(i)) ) 
                paintedPixelPerShape(j,k,i) = true;
           end
       end
    end
end

%# turn on any pixel that has been covered by at least one shape
paintedPixels = any(paintedPixelsPerShape,3);

我建议您在一幅图像中一次性将所有形状绘制为二值遮罩,然后计算图像上的像素数。如果去掉一个循环,它会更快,因为只扫描一次像素(而不是N次)。也许你可以将绘制每个形状的循环并行化…你是说在Photoshop程序中手动绘制?我不太明白。但是形状每次都是动态生成的。不,你可以在matlab中绘制形状。我不知道你的形状是什么格式,但是如果它是一个点序列,你可以在一个二进制图像中绘制每个填充的形状。此外,你当然可以简化双循环。你写的代码对我来说非常有意义,我写了那个代码,但Matlab仍然抱怨parfor中的paintedPixelPerShape无法分类。