Search code examples
matlabmultidimensional-arrayneighbours

How to find neighbors in 4D array in MATLAB?


I am a bit confused and would greatly appreciate some help.

I have read many posts about finding neighboring pixels, with this being extremely helpful:

http://blogs.mathworks.com/steve/2008/02/25/neighbor-indexing-2/

However I have trouble applying it on a 4D matrix (A) with size(A)=[8 340 340 15]. It represents 8 groups of 3D images (15 slices each) of which I want to get the neighbors. I am not sure which size to use in order to calculate the offsets. This is the code I tried, but I think it is not working because the offsets should be adapted for 4 dimensions? How can I do it without a loop?

%A is a 4D matrix with 0 or 1 values
Aidx = find(A); 

% loop here? 
[~,M,~,~] =size(A);
neighbor_offsets = [-1, M, 1, -M]';

neighbors_idx = bsxfun(@plus, Aidx', neighbor_offsets(:));
neighbors = B(neighbors_idx);

Thanks, ziggy


Solution

  • Have you considered using convn?

    msk = [0 1 0; 1 0 1; 0 1 0];
    msk4d = permute( msk, [3 1 2 4] ); % make it 1-3-3-1 mask
    neighbors_idx = find( convn( A, msk4d, 'same' ) > 0 ); 
    

    You might find conndef useful for defining the basic msk in a general way.