根据列(双精度而非字符)值对单元数组进行排序

3

I have a 3x1 cell array A which includes:

10.2  
15.2  
7.2   

另一个包含3个元素的单元数组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,以便在对它们进行排序时将其视为数字而不是字符。我尝试使用cell2mat将A和B分配给C,但没有成功。我已经在网上搜索了这个问题,但没有找到我想要的答案。
谢谢!
2个回答

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);
您的最终代码现在应该是:
>>
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'

感谢您的帮助,但我还有一个问题。A是3x1单元数组,其中每个单元格都是1x(数字数量)字符。因此,如果数字具有不同数量的数字,例如数组中同时出现0.2和0.03,则cell2mat会导致错误:CAT arguments dimensions are not consistent。cell2mat中的错误(第84行) m {n} = cat(1, c {:,n}); - Evan

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,:)

它没有起作用。a {:} 返回整个a而不是第一列。谢谢。 - Evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接