我有一个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但是没有用。我在网上搜索了这个,但找不到我要找的东西。
谢谢!
答案 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'};
在这种情况下,您需要进行以下更改:
str2double(A)
代替cell2mat(A)
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'
答案 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,:)