Элементы массива ячейки понижающей дискретизации, Matlab

Учитывая массив ячеек из n элементов (n > 1), каждый из которых представляет собой двумерный массив с числом строк и столбцов x=k (переменная по элементам ячейки), что будет лучшим способом для понижающей дискретизации каждой ячейки элемент путем случайного удаления выборок в 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 ответа

Решение

Это делает то, что вы хотите:

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

Предполагая случай массива чисел, вы можете попробовать это -

%// 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
Другие вопросы по тегам