【问题标题】:Downsampling cell array elements, Matlab下采样单元阵列元素,Matlab
【发布时间】:2014-05-18 15:37:46
【问题描述】:

给定一个包含 n 个元素 (n > 1) 的元胞数组,每个元素都是一个二维数组,其中 x=k 行数和 y 列(跨元胞元素可变),最好的方法是什么?通过随机删除 y-dim 中的样本来对每个单元格元素进行采样,以匹配所有单元格元素中的最短 y 长度?

下面的 sn-p 是错误实现,仅适用于 n=2,但方向正确(我希望如此)。任何帮助将不胜感激,谢谢!

sizeShortest = min(cellfun('size', data, 2));

sizeLongest = max(cellfun('size', data, 2));
idx = randperm(sizeLongest);
data = cellfun(@(x) x(:,idx(1:sizeShortest)), data, 'UniformOutput', false);

我想我可以使用 for 循环 遍历数据数组的每个单元格并检查该元素的 y 长度是否比最短的 长y 的所有细胞并随机删除样本。但可能有更好的解决方案..

谢谢!

【问题讨论】:

    标签: matlab cells downsampling


    【解决方案1】:

    这就是你想要的:

    sizeShortest = min(cellfun('size', data, 2));
    sizeLongest = max(cellfun('size', data, 2));
    f=@(x)(x(:,sort(getfield(randperm(size(x,2)),{1:sizeShortest}))))
    data = cellfun(f, data, 'UniformOutput', false);
    

    解释一下。

    生成最大为数组大小的索引,而不是最大为 sizeLongest。否则你会得到索引超出范围:

    g=randperm(size(x,2))
    

    Getfield用于允许双索引,应该实现的是:

    g(1:sizeShortest)
    

    这意味着,选择第一个索引。放入sort按顺序使用选中的索引,最后根据索引选择正确的列

    x(:,sort(...))
    

    【讨论】:

      【解决方案2】:

      假设一个单元格数组的情况,你可以试试这个 -

      %// c1 is input cell array
      
      k = size(c1{1},1)
      
      t1 = cellfun(@size,c1,'uni',0)
      t2 = cellfun(@numel,c1)./k
      
      mincols = min(t2)
      m1 = (t2-1)./(mincols-1)
      
      p1 = round(bsxfun(@times,0:mincols-1,m1)+1)
      p2 = [0; cumsum(t2(1:end-1))]
      p3 = reshape(bsxfun(@plus,p1,p2)',[],1) %//'
      
      ha1 = horzcat(c1{:})
      g1 = reshape(ha1(:,p3),k,mincols,[])
      g2 = reshape(permute(g1,[1 3 2]),size(g1,1)*size(g1,3),[])
      
      out = mat2cell(g2,k*ones(1,numel(c1)),mincols) %// desired downsampled output cell array
      

      【讨论】:

        猜你喜欢
        • 2018-07-22
        • 2023-04-09
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        相关资源
        最近更新 更多