在 MATLAB 中访问单元格的数据?

Accessing data of a cell in MATLAB?

我希望我能在 MATLAB 中使用 cellfun 函数得到一些帮助。

假设我有包含 5 个 10x2 矩阵的单元格,即

C = {[10x2], [10x2]...,[10x2]} 

但是,我想要一个新单元格,它在每个数组的两列中占据前 5 行,即我想要

D = {[5x2], [5x2]...,[5x2]}

有没有办法在 Matlab 中使用 cellfun 来做到这一点?我试过

D = cellfun(@(x) x(1:5),C,'UniformOutput',false)

但是这会返回一个单元格,该单元格仅包含每个数组中第一列的前 5 行(并且也被转置)即,我得到

D = {[1x5], [1x5]...,[1x5]}

希望我解释得很好。

有人可以帮忙吗?我认为有一种简单的方法可以做到这一点,但我是 cellfun 的新手。虽然看起来很有用。也许有一种我没有看到的更简单的方法?

您缺少列索引的定义:

A = rand(10,2)
C = {A,A,A,A,A};

%//           here ....|
D = cellfun(@(x) x(1:5,:), C,'UniformOutput',false)

在这种情况下,您需要 所有 列,这就是您使用 : 的原因。您也可以使用 x(1:5,1:2) - 在您的情况下它等于 x(1:5,:).


C = 

  Columns 1 through 5

    [10x2 double]    [10x2 double]    [10x2 double]    [10x2 double]    [10x2 double]


D = 

  Columns 1 through 5

    [5x2 double]    [5x2 double]    [5x2 double]    [5x2 double]    [5x2 double]

这是另一种方法,利用元胞数组中的所有矩阵都具有相同大小这一事实:

  1. 沿三维连接所有这些矩阵;
  2. 只保留需要的行;
  3. 从 3 维数组转换回元胞数组。

代码:

N = 5; %// number of rows to keep
D = cat(3, C{:}); %// step 1
D = squeeze(mat2cell(D(1:N,:,:), N, size(C{1},2), ones(1,numel(C)))).'; %// steps 2 and 3