下采样单元阵列元素,Matlab

时间:2014-05-18 15:37:47

标签: matlab cells downsampling

给定n个元素的单元阵列(n> 1),每个元素是一个2-d数组,其中x = k行数和y列(跨单元元素可变),什么是最好的向下方式 - 通过随机删除y-dim中的样本来匹配每个单元格元素,以匹配所有单元格元素中的最短y长度?

下面的代码段是一个错误的实现,只有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 所有细胞并随机移除样品。但是可能有更好的解决方案..

谢谢!

2 个答案:

答案 0 :(得分:0)

这样做你想要的:

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(...))

答案 1 :(得分:0)

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

%// 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