2014-05-18 3 views
0

각 요소는 x = k 개의 행과 y 열 (셀 요소에서 가변)을 갖는 2 차원 배열 인 n 개의 요소 (n> 1)의 셀 배열이 주어지면 모든 셀 요소에서 가장 짧은 y 길이와 일치하도록 y-dim의 샘플을 무작위로 제거하여 각 셀 요소를 다운 샘플링하는 가장 좋은 방법은 무엇입니까?다운 샘플링 셀 배열 요소, Matlab

아래 스 니펫은 잘못된 구현이며 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); 

가 난 데이터 배열의 각 셀을 통해 이동이 요소 길이 이상 최단보다 Y Y 모든 셀 임의로 분리되어 있는지 여부를 확인하기 위해 루프하는 을 사용할 수 추측 견본. 하지만 아마도 더 나은 해결책이있을 것입니다.

감사!

답변

0

이 당신이 원하는 것을 수행합니다

sizeShortest = min(cellfun('size', data, 2)); 
sizeLongest = max(cellfun('size', data, 2)); 
[email protected](x)(x(:,sort(getfield(randperm(size(x,2)),{1:sizeShortest})))) 
data = cellfun(f, data, 'UniformOutput', false); 

그것을 설명하기 위해.

최대 sizeLongest가 아닌 배열 크기까지 색인을 생성하십시오. 그렇지 않으면 당신은 아웃 오브 바운드 인덱스를 얻을 : Getfield 더블 색인을 허용하는 데 사용됩니다

g=randperm(size(x,2)) 

, 무엇을 구현해야하는 것입니다 : 의미

g(1:sizeShortest) 

는 첫 번째 인덱스를 선택합니다. sort 인덱스에 순서대로 선택한 인덱스를 사용하는 넣어, 그리고 마지막으로 기반 오른쪽 열

x(:,sort(...)) 
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