Arrays 在二维阵列中查找岛的长度分布?

Arrays 在二维阵列中查找岛的长度分布?,arrays,matlab,matrix,Arrays,Matlab,Matrix,我将用一个例子来解释我的问题。假设您有一个二维矩阵,如下所示: 5 4 3 8 0 0 5 4 2 9 1 0 5 6 2 7 2 0 5 4 7 9 0 0 5 6 7 1 2 0 孤岛是指相同元素的列组(零除外)。 我想找出岛的长度直方图,除了那些由零元素组成的岛 该矩阵具有 island-length occurrence 5 1 2 3 1 12 如何使用Matlab实现此任务?可能有较

我将用一个例子来解释我的问题。假设您有一个二维矩阵,如下所示:

5 4 3 8 0 0
5 4 2 9 1 0
5 6 2 7 2 0
5 4 7 9 0 0
5 6 7 1 2 0
孤岛是指相同元素的列组(零除外)。 我想找出
岛的长度直方图,除了那些由零元素组成的岛

该矩阵具有

island-length occurrence
  5               1
  2               3
  1               12

如何使用Matlab实现此任务?

可能有较短的可能性,但这样就可以了-并且它是完全矢量化的:

A = [5 4 3 8 0 0
     5 4 2 9 1 0
     5 6 2 7 2 0
     5 4 7 9 0 0
     5 6 7 1 2 0]

%// pad zeros to first line of A
X(2:size(A,1)+1,:) = A;

%// differences of X
dX = diff(X)

%// cumulative sum of "logicalized" differences
cs = cumsum(logical(dX(:)))
%// filter out zeros
cs = cs(logical(A(:)))
%// count occurances
aa = accumarray(cs,1)

%// unique occurances
uaa = unique(aa)
%// count unique occurances
occ = hist(aa,uaa).'
%// accumarray may introduce new zeros, filter out
mask = logical(uaa)

%// output
out = [occ(mask) uaa(mask)]


需要对我的一个旧代码片段稍作修改以过滤零。给你:

% Your Matrix
A = [ 5 4 3 8 0 0;
5 4 2 9 1 0;
5 6 2 7 2 0;
5 4 7 9 0 0;
5 6 7 1 2 0];

% Find Edges (Ends of Islands)
B = diff(A);
B = [ones(1,size(A,2));B~=0;ones(1,size(A,2))];

% At each column, find distances between island edges, filter out zero islands.
R = cell(size(A,2),1);
for i = 1:size(A,2)
    [C ~] = find(B(:,i));
    Ac = A(C(1:end-1),i);
    D = diff(C);
    D(Ac==0)=[];
    R{i} = D;
end

% Find histogram of island lengths
R = R(find(~cellfun(@isempty,R)),1);
R = cell2mat(R);
[a,~,c] = unique(R);
out = [a, accumarray(c,ones(size(R)))];

这似乎是一项非常艰巨的任务,您尝试过什么吗?是的,我尝试过使用2D数组转换为1D数组,然后执行以下操作。但是它的缺点是不能处理零。@dexterdev我缩短并简化了代码,你应该看看我的编辑哦,是的,我看过了。太好了。我感谢你的努力。
% Your Matrix
A = [ 5 4 3 8 0 0;
5 4 2 9 1 0;
5 6 2 7 2 0;
5 4 7 9 0 0;
5 6 7 1 2 0];

% Find Edges (Ends of Islands)
B = diff(A);
B = [ones(1,size(A,2));B~=0;ones(1,size(A,2))];

% At each column, find distances between island edges, filter out zero islands.
R = cell(size(A,2),1);
for i = 1:size(A,2)
    [C ~] = find(B(:,i));
    Ac = A(C(1:end-1),i);
    D = diff(C);
    D(Ac==0)=[];
    R{i} = D;
end

% Find histogram of island lengths
R = R(find(~cellfun(@isempty,R)),1);
R = cell2mat(R);
[a,~,c] = unique(R);
out = [a, accumarray(c,ones(size(R)))];