0

给定一个包含 n 个元素(n > 1)的元胞数组,每个元素都是一个二维数组,其中 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长,并随机删除样本。但可能有更好的解决方案..

谢谢!

4

2 回答 2

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(...))
于 2014-05-18T18:04:52.897 回答
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
于 2014-05-18T21:34:07.753 回答