3

我有一个 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,但没有奏效。我已经在网上搜索了这个,但找不到我要找的东西。

谢谢!

4

2 回答 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'
于 2013-04-18T02:05:30.623 回答
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,:)
于 2013-04-18T07:36:58.093 回答