同时访问元胞数组中的数据
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
如果 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