Matlab中高效的3D域邻接计算?

时间:2019-05-01 16:09:41

标签: matlab voronoi

我有一个Matlab脚本,可以在3D环形拓扑中生成附加的Voronoi域。由于在Matlab中没有本机加权Voronoi图,因此我将其计算为一个矩阵,在该矩阵中,体素最终属于不同的单元格,并由整数索引。 A slice through the partition 但是,我想获取单元格彼此相邻的数据,以便我可以分析拓扑的详细信息。

最明显的方法是遍历体素,检查6或26个相邻体素是否属于不同的域。这样可以在O(N ^ 3)的时间内运行,而且看起来不太并行。

还可以利用circshift查找有边界的位置(例如d=abs(im-circshift(im,[1,0]))>0; [i,j]=find(d);),遍历边界点并填写邻接关系数组(体素数组中每个方向一次通过) )。由于find不能很好地处理3D数组,因此我需要在z方向上使用特殊情况(请参见下面的代码示例)。这样比较好,但又不太慢,但又杂乱且不可并行。

我怀疑图像处理工具箱中有一些聪明的例程,但是我不是专家,在浏览文档时也看不到任何明显的线索。

关于如何有效计算邻接度的任何想法?

% Input 3D NxNxN array gg of domain membership
w=zeros(Nciv+1); % Adjacency matrix; index 1 corresponds to empty domains gg(i,j,k)=0
for z=1:N
    im=gg(:,:,z); % local slize
    imagesc(im);
    drawnow

    m1=abs(im-circshift(im,[1,0]))>0; % Borders in x-direction
    [i,j]=find(m1);
    for k=1:length(i)
        if (i(k)<N) % if not spanning edge of array
            w(1+im(i(k),j(k)),1+im(i(k)+1,j(k)))=1;
        else
            w(1+im(i(k),j(k)),1+im(1,j(k)))=1;
        end
    end

    m2=abs(im-circshift(im,[0,1]))>0; % Borders in y-direction
    [i,j]=find(m2);
    for k=1:length(i)
        if (j(k)<N) % if not spanning edge of array
            w(1+im(i(k),j(k)),1+im(i(k),j(k)+1))=1;
        else
            w(1+im(i(k),j(k)),1+im(i(k),1))=1;
        end
    end

    % z-direction case
    if (z<N)
        im2=gg(:,:,z+1);
    else
        im2=gg(:,:,1);
    end
    [i,j]=find(abs(im-im2)>0);
    for k=1:length(i)
        w(1+im(i(k),j(k)),1+im2(i(k),j(k)))=1;
    end
end
% Make adjacency matrix nice and display it 
w=w+w';
w=w-diag(diag(w));
w=(w>0);
spy(w)

0 个答案:

没有答案