基于列(double not char)值排序单元格数组

时间:2013-04-18 01:24:37

标签: arrays matlab sorting cell

我有一个3x1单元阵列A,其中包括:

10.2  
15.2  
7.2   

和另一个3x1单元阵列B包括:

m
l
s

我想将这些加入到一个新的3x2单元阵列C中,包括:

10.2  m
15.2  l
7.2   v

然后我想根据应该是

的第一列的值对C进行排序
7.2 v
10.2 m
15.2 l
到目前为止,我所做的是如下:

C=A;
C(:,2)=B;
C=sortrows(C,1);

但结果是:

10.2 m
15.2 l
7.2 v

我认为原因是它将第一列中的数字视为字符,并将它们排序的方式是从左侧逐个查看每个数字的数字。因此10.2小于7.2。登记/> 我正在寻找一种方法将数字作为数字分配给C,所以当我对它们进行排序时,它将它们视为数字而不是字符。我在将A和B分配给C时尝试使用cell2mat但是没有用。我在网上搜索了这个,但找不到我要找的东西。

谢谢!

2 个答案:

答案 0 :(得分:4)

这可以满足您的需求:

>>
C = cell(numel(A),2);
[Sorted_A, Index_A] = sort(cell2mat(A));
C(:,1) = num2cell(Sorted_A);
C(:,2) = B(Index_A);

例如,输入如下:

>>
A = {10.2; 15.2; 7.2};
B = {'m'; 'l'; 'v'};

结果将是:

>> C

C = 

    [ 7.2000]    'v'
    [10.2000]    'm'
    [15.2000]    'l'

修改

在您的情况下,输入数组A似乎不仅仅是数字的单元格数组,而是字符串的单元格数组;即,例如,

>>
A = {'10.2'; '15.2'; '7.2'};

在这种情况下,您需要进行以下更改:

  1. 使用str2double(A)代替cell2mat(A)
  2. 使用strtrim(cellstr(num2str(Sorted_A)))代替num2cell(Sorted_A);
  3. 您的最终代码现在将是:

    >>
    C = cell(numel(A),2);
    [Sorted_A, Index_A] = sort(str2double(A));
    C(:,1) = strtrim(cellstr(num2str(Sorted_A)));
    C(:,2) = B(Index_A);
    

    例如,输入如下:

    >>
    A = {'10.2'; '15.2'; '7.2'};
    B = {'m'; 'l'; 'v'};
    

    结果将是:

    >> C
    
    C = 
    
        '7.2'     'v'
        '10.2'    'm'
        '15.2'    'l'
    

答案 1 :(得分:2)

最简单的方法:使用sort的第二个输出:

% your data
a = {
    '10.2' 
    '15.2' 
    '7.2'
};

b = {
    'm'
    'l'
    's'
};

c = [a b];


% sort the first column, and save the indices    
[~,I] = sort(str2double(c(:,1)))

% use the indices to sort the concatenation c:
c(I,:)