从单元格数组中的每个单元格中提取特定元素

时间:2014-03-05 07:48:57

标签: matlab vectorization

我有一个大小为A的单元格数组10x10(比方说)。每个单元依次包含5x20矩阵。我想从每个单元格中选择(i,j)元素,其中(i,j)是循环中的索引。我可以运行4个for循环并轻松得到答案。 可能甚至更快,因为已经多次讨论过循环可能比cellfun,structfun等更快。

是否有使用cellfun的解决方案,我可以在(i,j)的循环中使用并在每个单元格中提取(i,j)元素?我尝试编写一个函数,它将作为cellfun的句柄,但我无法访问两个文件,即A{eachCellRow,eachCellCol}(i,j)

实施例: 如果A={[1 2;5 6], [3 4; 6 7]; [3 4; 6 7], [9 8; 5 6]};

然后i=1, j=1 and i=2, j=1输出应为:

B=[1 3; 3 9] and B=[5 6; 6 5]

3 个答案:

答案 0 :(得分:3)

CELL2MAT将包含仅由数字数据组成的单元格数组中的所有数据转换为数字数组。所以,这对我们有所帮助。对于您的原始问题,请尝试此操作 -

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

答案 1 :(得分:1)

易于使用的cellfun单行代码将是:

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

给出:

B =

     5     6
     6     5

优于Divakar's Solution它也适用于A中不一致的矩阵尺寸。

如果你想避开外环,另一个花哨的双线:

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(:) ))

给出:

>> 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

答案 2 :(得分:0)

如果内存不是问题,你可以沿着第三个暗点连接所有矩阵;索引非常简单:

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