【问题标题】:choosing the nth element in a matlab cell array在 matlab 元胞数组中选择第 n 个元素
【发布时间】:2016-09-30 03:13:55
【问题描述】:

我有一个尺寸为 1000x1(或更大)的元胞数组 VsCell。 VsCell 中的每个项目都是一个 501x567 矩阵。我想提取在单元格中包含的所有矩阵中占据一个位置的元素。基本上是这样的:

VsCell{:}(1,1) - 用于单元格中数组的所有第一个元素 VsCell{:}(2,1) - 用于单元格中数组的所有第一行 2 元素。

随后,我打算取这些选择的平均值或中值并填充单个 [501x567] 矩阵数组,它表示 VsCell 数组的平均值/中值/等,例如均值(VsCell{:}(1,1))。

我尝试了 VsCell{:}(1,1) - 但它返回“错误的单元格引用操作”。

另外,有没有办法在很少或没有 for 循环/cellfun 的情况下实现这一目标? 使用网上找到的示例,我无法真正做到这一点。

非常感谢您抽出宝贵时间,如果需要,我很高兴进一步澄清。

【问题讨论】:

    标签: arrays matlab matrix cell


    【解决方案1】:

    我不认为你想要做的事情可以用单元格来完成,没有循环或cellfun,也就是说。单元格是异构数据结构,不能保证每个元素都具有兼容的形状。哎呀,您单元格中的第 3 个元素甚至可以是另一个单元格、字符串或自定义类实例!我只是说,不能以您尝试的方式索引单元格,这并不奇怪。

    但是,您可以 concatenate 将您的单元格放入更高维的数组中,然后使用它:

    VsMat = cat(3,VsCell{:}); % cell as comma separated list
    MatMeans = mean(VsMat,3); % mean along dimension 3, where they are concatenated
    MatMedians = median(VsMat,3);
    MatSums = sum(VsMat,3);
    

    无论如何,使用数组应该更快,所以除了调用cat 的单一权衡(这很慢),你可能最好还是使用同构数组。

    【讨论】:

    • 非常感谢@Andras!你是对的,我选择使用数组来提高速度。 cat 对于这项工作来说并不算太糟糕,考虑到我的数据集可能会变得非常大,它比使用嵌套的 for 循环做得更好。
    • cat 方法在数组的大小限制下工作正常,之后出现内存不足错误。你有什么建议吗?在这一点上,我什至不介意 cellfun 或 for 循环实现。谢谢
    • @QP1 这很有趣,我认为您在cat() 之后得到的数组比单元格本身占用的空间更少。两种可能的解释是(1)您的数据太大以至于同时只有一个副本适合内存,因此原始单元+新数组太多,或者(2)cat 有内存开销。在第二种情况下,您可以使用VsMat=zeros([size(VsCell{1},length(VsCell)]); 进行预分配,然后在k 的循环中设置VsMat(:,:,k),而不是使用cat。在第一种情况下,我不确定是否有简单的出路,所以先尝试第二种;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多