Algorithm 并行算法:检查一个像素是否被其中一个形状覆盖
在二维空间中有一张地图,坐标在x轴上从leftPos到rightPos,在y轴上从bottomPos到topPos 这张地图上有各种形状:三角形、圆形、正方形。共有N个形状。我试图计数像素,如果它在任何形状内。形状可以重叠,因此可能具有相交区域 我的代码是: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
% 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无法分类。