0

n 要素 (n > 1) のセル配列が与えられ、各要素が x=k 行数と y 列 (セル要素全体で可変) の 2 次元配列である場合、各セルをダウンサンプリングする最良の方法は何でしょうか? 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 に答える