对具有相同 zoneID 的相邻单元格进行分组,MATLAB

Posted

技术标签:

【中文标题】对具有相同 zoneID 的相邻单元格进行分组,MATLAB【英文标题】:Group neighboring cells with the same zoneID, MATLAB 【发布时间】:2012-11-06 10:15:12 【问题描述】:

假设我有以下“区域”矩阵

brk_group =

     1     1     1     1
     3     2     2     3
     3     3     3     3

我想为这些值创建一个“分组矩阵”。一个组被定义为具有相同区域值的相邻单元格(上、右、下、左)。

一个区域值可以有多个组,因为区域不必在空间上连接。

数据:

brk_group = [1 1 1 1; 3 2 2 3; 3 3 3 3]

下面的“我的当前代码”有什么问题......

单元格 (2,4) 中的区域值“3”连接到单元格 (2,1) 中的区域值“3”但是当我当前答案中的循环达到 (2,4) 时,看不到这种连通性并会创建一个新组,错误地将单元格 (2,1) 和 (2,4) 分组...

编辑:只想使用基本的 MATLAB,请不要使用图像处理工具箱! =)

澄清:区域定义为具有相同区域值的所有单元格。组被定义为具有相同区域值的所有空间连接(上、下、左、右)单元。

我的当前代码:

function [groupMat groupIds] = createZoneGroups(zoneMat)
%
% groupMat = createZoneGroups(zoneMat)
%
% Groups zones spatially.
%
%   Input:
%       zoneMat: nxm matrix of "zones".
%
%   Output:
%       groupMat: nxm matrix of group ID's
%       groupIds: An array of unique group ID's
%
%   Note: A group is defined as spatially connected same zones. Diagonal
%       cells are not spatially connected.
%
%   Author: Kyle W. Purdon
%
groupIds = [];
groupMat = nan(size(zoneMat));
for rowIdx = 1:size(zoneMat,1)
    for colIdx = 1:size(zoneMat,2)

        % Check if the cell is nan, if so group(r,c)=nan
        if isnan(zoneMat(rowIdx,colIdx))
            continue;
        end

        % Check if the current cell has a group, if it does, break.
        if ~isnan(groupMat(rowIdx,colIdx))
            continue;
        end

        % Check the surrounding cells for groups, if any of the surrounding
        % cells (1) have a group, and (2) are in the same zone, assighn the
        % current cell that group. If not assign the current cell a new
        % group.

        % Check top cell
        if rowIdx > 1 && ~isnan(groupMat(rowIdx-1,colIdx))
            if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx-1,colIdx));
                groupMat(rowIdx,colIdx) = groupMat(rowIdx-1,colIdx);
                continue;
            end
        end
        % Check right cell
        if colIdx < size(zoneMat,2) && ~isnan(groupMat(rowIdx,colIdx+1))
            if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx,colIdx+1));
                groupMat(rowIdx,colIdx) = groupMat(rowIdx,colIdx+1);
                continue;
            end
        end
        % Check bottom cell
        if rowIdx < size(zoneMat,1) && ~isnan(groupMat(rowIdx+1,colIdx))
            if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx+1,colIdx));
                groupMat(rowIdx,colIdx) = groupMat(rowIdx+1,colIdx);
                continue;
            end
        end
        % Check left cell
        if colIdx > 1 && ~isnan(groupMat(rowIdx,colIdx-1))
            if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx,colIdx-1));
                groupMat(rowIdx,colIdx) = groupMat(rowIdx,colIdx-1);
                continue;
            end
        end

        % If the loop gets to this point, assign a new groupId to the cell.
        if isempty(groupIds)
            groupIds = 1;   % Start with group #1
        else
            groupIds(end+1) = groupIds(end)+1;  %Increment the last group by 1.
        end

        groupMat(rowIdx,colIdx) = groupIds(end);

    end
end
end

【问题讨论】:

【参考方案1】:

通过我必须在 MATLAB 交换中真正挖掘的代码解决。

它本质上是使用“Union-Find”算法的 bwlabel() 的“通用”版本。

http://www.mathworks.com/matlabcentral/fileexchange/26946-label-connected-components-in-2-d-array

【讨论】:

这实际上并不完全有效。我有一个示例(将在问题中发布),由于单元格相对于组中其他单元格的位置,连接区域以多个组结束。

以上是关于对具有相同 zoneID 的相邻单元格进行分组,MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有多种单元格类型的分组表视图?

VBA - 根据具有数据的相邻单元格的计数插入行

报表中怎么把相同值的单元格合并成一个大格

报表中怎么把相同值的单元格合并成一个大格

JavaScript合并网页表格中内容相同的相邻单元格

创建具有不同单元格类型的分组 UITableview