如果A
是具有(x,y)
个单元格的n
单元格数组,并且每个单元格都是大小为(m,n)
且类型为double
的向量。
Example: If A is a 1x2 cell array
A =
[100x1 double] [100x1 double]
假设我想同时访问每个单元格的第一个元素,我们该怎么做?
同样,如果我们需要从每个单元格中访问i
元素,我们如何推广代码?
答案 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