2014-03-31 46 views
0

我的數據是一個名爲PM25的1x7單元。在每個單元格內,還有另一個大小爲365x5xN的單元格,其中N變化。下面是PM25 {1,1}的一部分(該數據可以在這裏找到:https://www.dropbox.com/sh/li3hh1nvt11vok5/4YGfwStQlo變量的問題是PM25)基於具有NaN的列對單元格陣列進行排序

'42.493056' '-92.343889' '19-013-0008' [733043] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733044] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733045] '3.6' 
'42.493056' '-92.343889' '19-013-0008' [733046] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733047] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733048] '10' 
'42.493056' '-92.343889' '19-013-0008' [733049] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733050] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733051] '5.8' 
'42.493056' '-92.343889' '19-013-0008' [733052] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733053] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733054] '7.7' 

我試圖通過最後一列,濃度整個小區進行排序。這是我一直在做的事情:

% Sort each site based on the concentration values - Descending order with NaN's at the bottom 
for i = 1:length(names_PM25_O3) % States 
    for j = 1:length(PM25{i}(1,1,:)) % Number of sites 
     [~,ix] = sort(str2double(PM25{i}(:,5,j))); % Sorted indices 
     nanmask = isnan(str2double(PM25{i}(ix,5,j))); % Get mask (0 or 1) of nan-rows to be ignored 
     ix = flipdim(ix(~nanmask),1); % Get non-nan indices in reverse order 
     PM25_sorted{i} = PM25{i}(ix,:,:); % Sort 
    end 
end 

事情是,這段代碼只排序PM25中7個單元中每個單元的最後N個。所有其他N根據最後的N進行排序,並且我最終得到小於365的值,這可能是因爲NaN在最後的N中被刪除。例如,這裏將是N = 1(PM25)的一部分{1,1}(:,:,1))

'42.493056' '-92.343889' '19-013-0008' [733396] '63' 
'42.493056' '-92.343889' '19-013-0008' [733393] '37.5' 
'42.493056' '-92.343889' '19-013-0008' [733108] '28.7' 
'42.493056' '-92.343889' '19-013-0008' [733207] '23.1' 
'42.493056' '-92.343889' '19-013-0008' [733366] '27.7' 
'42.493056' '-92.343889' '19-013-0008' [733255] '19.2' 
'42.493056' '-92.343889' '19-013-0008' [733063] '24.7' 
'42.493056' '-92.343889' '19-013-0008' [733225] '11.7' 
'42.493056' '-92.343889' '19-013-0008' [733066] '19.9' 
'42.493056' '-92.343889' '19-013-0008' [733250] [ NaN] 
'42.493056' '-92.343889' '19-013-0008' [733387] '26.5' 
'42.493056' '-92.343889' '19-013-0008' [733153] '15.6' 
'42.493056' '-92.343889' '19-013-0008' [733384] '12.9' 

雖然這將是最後N的一部分,N = 21 PM25 {1,1}(:,:,21)

'42.695391' '-93.655976' '19-197-0004' [733396] '48' 
'42.695391' '-93.655976' '19-197-0004' [733393] '36.4' 
'42.695391' '-93.655976' '19-197-0004' [733108] '33.3' 
'42.695391' '-93.655976' '19-197-0004' [733207] '25.4' 
'42.695391' '-93.655976' '19-197-0004' [733366] '24.3' 
'42.695391' '-93.655976' '19-197-0004' [733255] '22.4' 
'42.695391' '-93.655976' '19-197-0004' [733063] '21' 
'42.695391' '-93.655976' '19-197-0004' [733225] '20' 
'42.695391' '-93.655976' '19-197-0004' [733066] '19.8' 
'42.695391' '-93.655976' '19-197-0004' [733250] '19.6' 
'42.695391' '-93.655976' '19-197-0004' [733387] '19.5' 
'42.695391' '-93.655976' '19-197-0004' [733153] '19.2' 
'42.695391' '-93.655976' '19-197-0004' [733384] '18.8' 

正如你所看到的,N = 21按降序排列,所有的NaN都消失了。但N = 1只是N = 21的順序(查看第4列,日期 - 順序相同),所以它不按降序排序。

我怎樣才能得到它,因此整個細胞分別排序?否則,我可能不得不保留NaN行,每個N將是不同的長度。目前,它看起來像他們正在從排序N.刪除

回答

1

功能 -

function sorted_cell_array = sortcell_col5(org_cell_array) 

col5 = org_cell_array(:,5); 
isnum = cellfun(@isnumeric,col5); 
t2 = NaN(size(org_cell_array,1),1); 
t2(~isnum) = str2num(char(col5(~isnum))); 
[~,y1] = sort(t2); 
c1 = nnz(~isnan(t2)); 
if ~c1 
    sorted_cell_array = org_cell_array(y1,:); 
else 
    ind1 = [ flipud(y1(1:c1)) ; y1(c1+1:end) ]; 
    sorted_cell_array = org_cell_array(ind1,:); 
end 

return; 

主要腳本 -

load data_2007.mat %%// Load your data mat file 

PM25_sorted = PM25; 
M1 = size(PM25,2); 
for k1 = 1:M1 
    [sz1,sz2,N] = size(PM25{1,k1}); 
    for k2 = 1:N 
     PM25_sorted{1,k1}(:,:,k2) = sortcell_col5(PM25{1,k1}(:,:,k2)); 
    end 
end 
+0

排序的。輸出是我想要的,但我擁有的單元陣列不僅僅是我粘貼的示例。這是幾層深。你可以在我發佈的鏈接中看到它。 – shizishan

+0

@shizishan嘗試編輯。 – Divakar

+0

@shizishan在數字之後你想要'NaNs'嗎? – Divakar

相關問題