同时访问元胞数组中的数据

Accessing data from cell arrays at the same time

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

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

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

同样,如果我们需要从每个单元格访问第 i 个元素,我们如何概括代码?

使用两个 1*10 数组创建单元格:

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

A = [1x10 double] [1x10 double]

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

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

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

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

ans = 5 10

正如 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);

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

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 循环,它会从每个单元格索引中选择第一个元素并将其放入 ObsMat

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

cellfun 也是 for 循环

的包装函数
ObsMat =

     2     5