2014-05-18 88 views
0

給定一個n元素(n> 1)的單元陣列,每個元素是一個x = k行數和y列(跨單元元素變量)的二維數組,通過隨機刪除y-dim中的樣本以匹配所有單元格元素中最短的y長度來下采樣每個單元格元素的最佳方法?向下採樣單元陣列元素,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); 

我想我可以使用for循環要經過數據陣列的每個單元,並檢查該元素是否具有ý長度比最短長ÿ所有細胞的和隨機除去樣本。但可能有更好的解決方案..

謝謝!

回答

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。否則,你得到的索引超出範圍:

g=randperm(size(x,2)) 

getfield命令用來允許雙索引,應該怎樣實現的是:

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