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)))];