【问题标题】:Accessing data of a cell in MATLAB?在 MATLAB 中访问单元格的数据?
【发布时间】:2015-04-27 16:02:05
【问题描述】:

我希望能在 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 的新手。不过似乎很有用。也许还有一种我没有看到的更简单的方法?

【问题讨论】:

    标签: matlab indexing analytics cell-array


    【解决方案1】:

    您缺少列索引的定义:

    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]
    

    【讨论】:

      【解决方案2】:

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

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

      代码:

      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
      

      【讨论】:

      • 在这种情况下是不是有点矫枉过正?我无法生成比cellfun 更快的案例,而且无论如何它更复杂?
      • @thewaywewalk 是的,这可能是矫枉过正。但是你已经给出了最简单的答案(BTW 已经 +1),所以我只剩下这个了:-)
      • 好吧,我不习惯我们都有答案而我的答案实际上更好;)
      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多