2015-12-01 82 views
3

說我有一個數組大小100x150x30,地理網格100x150 30個值爲每個網格點,並希望找到沿着第三維連續元素具有最小3.查找3D陣列的連續值

一個諧調感長度

我想找到連續元素塊的最大長度,以及出現的次數。

我已經試過這一個簡單的載體:

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 

現在我想將其應用到我的陣列的第三維。

隨着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);。我無法讓它工作。

有沒有辦法把它放在一個循環中,還是我必須以另一種方式找到連續的值?

感謝您的幫助!

回答

2
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

2

這裏有一個量化的方法 -

%// 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 
+0

我等着你來偷接受離我:P – Adriaan

+0

@Adriaan OP是尋找一個糊塗的解決它似乎,所以我想你反正是安全的! ;) – Divakar

+1

當'bsxfun'軍隊來臨時,沒有迴路是安全的。更別說兩個循環。你的解決方案顯然要快得多 – Adriaan