Элементы массива ячейки понижающей дискретизации, 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