在 3D 数组中查找连续值

Find consecutive values in 3D array

假设我有一个大小为 100x150x30 的数组,一个 100x150 的地理网格,每个网格点有 30 个值,并且想要沿着第三个维度找到连续的元素,最小长度为 3。

我想求连续元素块的最大长度,以及出现的次数。

我已经在一个简单的向量上试过了:

var=[20 21 50 70 90 91 92 93];
a=diff(var);

q = diff([0 a 0] == 1);
v = find(q == -1) - find(q == 1);

v = v+1;
v2 = v(v>3);
v3 = max(v2); % maximum length: 4
z = numel(v2); % number: 1

现在我想将其应用于数组的第 3 维。

A 是我的 100x150x30 阵列,我已经走到这一步了:

aa = diff(A, 1, 3);

b1 = diff((aa == 1),1,3);
b2 = zeros(100,150,1);

qq = cat(3,b2,b1,b2);

但我还停留在下一步,即:find(qq == -1) - find(qq == 1);。我做不到。

有没有办法把它放在一个循环中,还是我必须用另一种方法找到连续的值?

感谢您的帮助!

A = randi(25,100,150,30); %// generate random array
tmpsize = size(A); %// get its size
B = diff(A,1,3); %// difference
v3 = zeros(tmpsize([1 2])); %//initialise
z = zeros(tmpsize([1 2]));
for ii = 1:100 %// double loop over all entries
    for jj = 1:150
        q = diff([0 squeeze(B(ii,jj,:)).' 0] == 1);%'//
        v = find(q == -1) - find(q == 1);
        v=v+1;
        v2=v(v>3);
        try %// if v2 is empty, set to nan
        v3(ii,jj)=max(v2);
        catch
            v3(ii,jj)=nan;
        end
        z(ii,jj)=numel(v2);
    end
end

以上似乎有效。它只是在你想要得到差异的两个维度上双重循环。

我认为你被卡住的部分是使用 squeeze 获取向量以放入你的变量 q

try/catch 只是为了防止 v2 中的空连续数组在对 v3 的赋值中抛出错误,因为那会删除它的条目。现在它只是将其设置为 nan,当然你可以将其切换为 0

这是一种矢量化方法 -

%// Parameters
[m,n,r] = size(var);
max_occ_thresh = 2        %// Threshold for consecutive occurrences

% Get indices of start and stop of consecutive number islands
df = diff(var,[],3)==1;   
A = reshape(df,[],size(df,3));
dfA = diff([zeros(size(A,1),1) A zeros(size(A,1),1)],[],2).'; %//'
[R1,C1] = find(dfA==1);
[R2,C2] = find(dfA==-1);

%// Get interval lengths
interval_lens = R2 - R1+1;

%// Get max consecutive occurrences across dim-3
max_len = zeros(m,n);
maxIDs = accumarray(C1,interval_lens,[],@max);
max_len(1:numel(maxIDs)) = maxIDs

%// Get number of consecutive occurrences that are a bove max_occ_thresh
num_occ = zeros(m,n);
counts = accumarray(C1,interval_lens>max_occ_thresh);
num_occ(1:numel(counts)) = counts

样本运行-

var(:,:,1) =
     2     3     1     4     1
     1     4     1     5     2
var(:,:,2) =
     2     2     3     1     2
     1     3     5     1     4
var(:,:,3) =
     5     2     4     1     2
     1     5     1     5     1
var(:,:,4) =
     3     5     5     1     5
     5     1     3     4     3
var(:,:,5) =
     5     5     4     4     4
     3     4     5     2     2
var(:,:,6) =
     3     4     4     5     3
     2     5     4     2     2
max_occ_thresh =
     2
max_len =
     0     0     3     2     2
     0     2     0     0     0
num_occ =
     0     0     1     0     0
     0     0     0     0     0