对单元阵列进行排序

时间:2014-03-07 20:59:34

标签: matlab sorting cell

我有一个基于列排序的单元格数组。但是,MATLAB告诉我sortrows不适用于单元阵列。我在其他一些问题上看到它确实有效,但我不知道我做错了什么。

我正在看的单元格数组称为PM25。这是一个1x7的细胞。 7 PM25 {i}中的每一个都是365x5xnumber的形式,其中数字不同。

以下是.mat文件的链接:https://www.dropbox.com/sh/li3hh1nvt11vok5/4YGfwStQlo 它是PM25变量。

我基本上想要进入365x5xnumber级别,并根据第5列对每个级别进行排序。

这就是我一直在做的事情。我转换为双倍因为这是MATLAB允许我进行排序的唯一方法,但我不愿意,因为我在日期和名称列中丢失了一些信息。当我以单元格形式离开时,MATLAB会告诉我,细胞不能用于分拣机,或者我没有将数据作为二维矩阵。

for i = 1:length(names) % 7 states
    for j = 1:length(PM25{i}(1,1,:)) % length of each of the `numbers` - Number of sites
        PM25_info = str2double(PM25{i});
        PM25_sorted = sortrows(PM25_info(:,:,j),5);  
    end
end

上面的代码不会生成错误,但仍然不会对第5列进行排序。我不知道出了什么问题。

理想的做法是将PM25作为一个单元格进行排序。

2 个答案:

答案 0 :(得分:0)

我不确定你在没有转换的情况下尝试了什么,但我尝试了下面的代码,它似乎也按照你想要的方式工作。它似乎也没有丢失任何信息。我希望这对你有用。

%Getting 7 random matrices 365x5xnumber
a = rand(365,5,floor(rand(1).*8)+1).*10;
b = rand(365,5,floor(rand(1).*8)+1).*10;
c = rand(365,5,floor(rand(1).*8)+1).*10;
d = rand(365,5,floor(rand(1).*8)+1).*10;
e = rand(365,5,floor(rand(1).*8)+1).*10;
f = rand(365,5,floor(rand(1).*8)+1).*10;
g = rand(365,5,floor(rand(1).*8)+1).*10;

%put in cell array
PM25 = {a,b,c,d,e,f,g};

for i = 1:length(PM25)%7 states
    for j = 1:length(PM25{i}(1,1,:))%length of numbers
        PM25_sort{i}(:,:,j) = sortrows(PM25{i}(:,:,j),5);
    end
end  

答案 1 :(得分:0)

使用Cellfun

%Creating an example cell array
a=cell(1,7);
for i=1:7
   a{i}=rand(365,5,randi(10));
end
result=cellfun(@(x) sort(x,2),a,'UniformOutput',false);

result将是一个1x7单元格数组,其中每个矩阵将根据第二维进行排序。