Extracting a specific element from each cell within cell array

前端 未结 3 676
轻奢々
轻奢々 2021-01-21 01:24

I have a cell array A of size 10x10 (say). Each cell in turn contains a 5x20 matrix. I want to select (i,j) element from each

相关标签:
3条回答
  • 2021-01-21 02:12

    If memory is not an issue, you can concat all matrices along a third dim; and then indexing is very easy:

    %// Example data
    A = {[1 2;5 6], [3 4; 6 7]; [3 4; 6 7], [9 8; 5 6]};
    ii = 2;
    jj = 1;
    
    %// Compute the result B
    A2 = cat(3,A{:}); %// concat along third dim
    B = reshape(A2(ii,jj,:),size(A{1})); %// index A2 and reshape
    
    0 讨论(0)
  • 2021-01-21 02:14

    CELL2MAT gets all the data from a cell array that consists of numeric data only, into a numeric array. So, that helped us here. For your original problem, try this -

    celldim_i = 10;
    celldim_j = 10;
    
    block_size_i = 5;
    block_size_j = 20;
    
    search_i = i; %// Edit to your i
    search_j = j; %// Edit to your j
    
    A_mat = cell2mat(A);
    out = A_mat(search_i+block_size_i*(0:celldim_i-1),search_j+block_size_j*(0:celldim_j-1))
    
    0 讨论(0)
  • 2021-01-21 02:23

    The easy to use cellfun one-liner would be:

    ii = 2;
    jj = 1;
    A = {[1 2;5 6], [3 4; 6 7]; [3 4; 6 7], [9 8; 5 6]};
    
    B = cell2mat( cellfun( @(x) x(ii,jj), A, 'uni', 0) )
    

    gives:

    B =
    
         5     6
         6     5
    

    Advantage over Divakar's Solution: it works also for inconsistent matrix sizes in A.

    And if you want to avoid also the outer loop, another fancy two-liner:

    dim = [2 2];
    [II, JJ] = meshgrid( 1:dim(1), 1:dim(2) );
    
    C = cellfun( @(y) ...
        { cell2mat( cellfun( @(x) x( real(y), imag(y) ), A, 'uni', 0) ) },...
          num2cell( II(:)+1i*JJ(:) ))
    

    gives:

    >> celldisp(C)
    
    C{1} =            % ii = 1 , jj = 1
    
         1     3
         3     9
    
    
    
    C{2} =            % ii = 1 , jj = 2
    
         2     4
         4     8
    
    
    
    C{3} =            % ii = 2 , jj = 1
    
         5     6
         6     5
    
    
    
    C{4} =            % ii = 2 , jj = 2
    
         6     7
         7     6
    
    0 讨论(0)
提交回复
热议问题