同时从单元阵列访问数据

时间:2016-09-01 09:05:32

标签: matlab cell-array

如果A是具有(x,y)个单元格的n单元格数组,并且每个单元格都是大小为(m,n)且类型为double的向量。

Example: If A is a 1x2 cell array
A = 
[100x1 double]  [100x1 double]

假设我想同时访问每个单元格的第一个元素,我们该怎么做?

同样,如果我们需要从每个单元格中访问i元素,我们如何推广代码?

3 个答案:

答案 0 :(得分:4)

使用两个1 * 10阵列创建单元格:

A {1} = zeros(1,10)  ;
A {2} = zeros (1,10) ;
  

A =       [1x10双] [1x10双]

添加一些将用于稍后提取的数据:

A {1}(5) = 5 ;
A {2}(5) = 10 ;

从单元格内的两个数组中获取相同索引处的数据的例程:

cellfun (@(x) x(5),A)
  

ans =            5 10

答案 1 :(得分:2)

正如User1551892建议的那样,您可以使用 cellfun 。另一种方法是首先将单元格重构为矩阵。 操作的速度取决于每个单元格中的单元格数量和矩阵的大小。

% Number of cells
x = 3;
y = 2;

% Size of matrix 
m = 1;
n = 100;

% Add some random numbers 
A = cell(x,y);
for i = 1:numel(A)
    A{i} = round(rand(m,n)*100);
end

% Index to pick in each matrix
idx = 5;

% Convert to matrix
B = [A{:}];

% Pick the number
val = B(idx:(n*m):end);

进行som tic-toc测量,上述方法对于示例值更快。只要n或m中的一个很小,方法就可以了。 但是如果m和n都变大,那么cellfun会更好(更快)

val = cellfun(@(x) x(idx), A);

答案 2 :(得分:1)

另一种方法是直接访问单元格元素,例如我们有一个像你定义的单元格

A{1}(1:10) = randi([2 5],1,10);
A{2}(1:10) = randi([2 5],1,10);

现在如果你想访问第i个元素,只需声明i,它们将在下面的矩阵中检索

 i = 3;

ObsMatrix = [A{1}(i) A{2}(i)]

ObsMatrix =

     2     5

如果A具有未知数量的单元格,您可以简单地使用for循环,它将从每个单元格索引中选择第i个元素并将其放入ObsMat

i = 3;
for j=1:numel(A)
ObsMat(end + 1) = A{j}(3);
end

cellfun也是for循环

的包装函数
ObsMat =

     2     5