Matlab通过第一列的字符串数重新排列2D单元阵列的行

时间:2016-11-01 09:14:04

标签: matlab sorting cell-array

我有一个像这样的matlab单元

BCLK103     4.000    5.112    7.055    
BCLK105     5.000    5.112    7.255
BCLK109     4.050    5.112    7.152
BCLK103     4.000    5.112    7.555
BCLK109     7.000    5.112    7.545
BCLK105     4.060    6.12     8.555
BCLK103     4.600    6.182    9.55
BCLK109     4.900    6.142    8.545

我想要

BCLK103     4.000    5.102    7.055    
BCLK103     4.100    5.112    7.555
BCLK103     4.600    6.182    9.55
BCLK105     5.000    5.112    7.255
BCLK105     4.060    6.12     8.555
BCLK109     4.050    5.112    7.152
BCLK109     7.000    5.112    7.545
BCLK109     4.900    6.142    8.545

我尝试使用

Str = sprintf('%s,', CellArray{:,:});
D = sscanf(Str, '%g,');
[dummy, index] = sort(D);
sortedCellArray = CellArray(index);

但是Matlab给出了

Warning: The argument for the %s format specifier must be of type char (a string).

有人请教我如何用第一列中最后一个数字(即103,105,109)的字符串(即BCLK103,BCLK105,BCLK109)重新排列这个单元格行的行吗?抱歉,我是matlab的新学员。

谢谢。

2 个答案:

答案 0 :(得分:2)

你必须安排第一列,获取索引,然后你可以订购整个单元格,这里我只复制了前两列:

a = 

'BCLK103'    [     4]
'BCLK105'    [     5]
'BCLK109'    [4.0500]
'BCLK103'    [     4]
'BCLK109'    [     7]
'BCLK105'    [4.0600]
'BCLK103'    [4.6000]
'BCLK109'    [4.9000]

获取索引:

[~,ind_sort]=sort(a(:,1));

使用a(ind_sort,:)

订购整个单元格
'BCLK103'    [     4]
'BCLK103'    [     4]
'BCLK103'    [4.6000]
'BCLK105'    [     5]
'BCLK105'    [4.0600]
'BCLK109'    [4.0500]
'BCLK109'    [     7]
'BCLK109'    [4.9000]

Matlab不允许您使用sort排列整个单元格,因为它在所有单元格中都需要相同的数据类型,并且只有第一列有字符串。

答案 1 :(得分:1)

假设第一列始终具有示例中的结构(相同的字母后跟固定的数字位数),您可以使用sortrows

x = {'BCLK103'     4.000    5.112    7.055    
     'BCLK105'     5.000    5.112    7.255
     'BCLK109'     4.050    5.112    7.152
     'BCLK103'     4.000    5.112    7.555
     'BCLK109'     7.000    5.112    7.545
     'BCLK105'     4.060    6.12     8.555
     'BCLK103'     4.600    6.182    9.55
     'BCLK109'     4.900    6.142    8.545}; % data
y = sortrows(x,1); % sort rows based on first column

这给出了

y = 
    'BCLK103'    [     4]    [5.1120]    [7.0550]
    'BCLK103'    [     4]    [5.1120]    [7.5550]
    'BCLK103'    [4.6000]    [6.1820]    [9.5500]
    'BCLK105'    [     5]    [5.1120]    [7.2550]
    'BCLK105'    [4.0600]    [6.1200]    [8.5550]
    'BCLK109'    [4.0500]    [5.1120]    [7.1520]
    'BCLK109'    [     7]    [5.1120]    [7.5450]
    'BCLK109'    [4.9000]    [6.1420]    [8.5450]