如何在Matlab中对表的各个部分进行排序?

时间:2017-06-15 13:02:25

标签: matlab sorting

我在Matlab中有一个表,其中包含来自不同测试人员的测试数据。该测试有七个视频片段,每个视频片段有四个不同的音频版本,测试人员必须按1到100的等级进行评分。每个视频片段都会显示两次,以保证统计准确性。测试人员按下接口上的按钮1-4以听取不同的音频版本。

我的表包含以下列(在与问题无关的其他列中):

Test Person ID        Audio Version     Video Clip   Rating
               1            1           Forest       40
               1            2           Forest       60
               1            3           Forest       20
               1            4           Forest       100

现在,为了在测试期间对特定按钮的任何优点引入最小偏差,音频版本在每个视频剪辑之间随机置换。这意味着真实数据看起来会更像这样(音频版未分类):

Test Person ID      Audio Version       Video Clip  Rating
               1            1           Forest      40
               1            2           Forest      60
               1            3           Forest      20
               1            4           Forest      100
               1            3           City        10
               1            2           City        50
               1            1           City        40
               1            4           City        7
               1            4           Inside      90
               1            2           Inside      58
               1            1           Inside      22
               1            3           Inside      35

我想要做的是:保持视频片段的正确顺序,因此仍然有森林 - >城市 - >在里面,但是它们全部都是有序的,所以它总是音频版本1,2,3,4:

Test Person ID      Audio Version       Video Clip  Rating
               1            1           Forest      40
               1            2           Forest      60
               1            3           Forest      20
               1            4           Forest      100
               1            1           City        40
               1            2           City        50
               1            3           City        10
               1            4           City        7
               1            1           Inside      22
               1            2           Inside      58
               1            3           Inside      35
               1            4           Inside      90

我最初的想法是在Matlab中使用sortrow()函数,然后将其与视频剪辑一起按升序排序,但由于视频剪辑在测试的不同阶段被引入两次,我想保持相同表中的剪辑序列不起作用。同样的视频剪辑也会呈现给众多不同的测试人员。

我正在使用预制函数,必须以这种方式对数据进行排序,以对其执行统计计算。此函数从结构中获取Matlab数据,并通过for循环行将其放入表中。

因为数据是通过for循环放入表中的,我认为可能有一种方法只能一次排序固定数量的行即1-4行,5-8 ,9-12等等。 你知道是否有办法在Matlab中只对表的一部分进行排序?

3 个答案:

答案 0 :(得分:2)

您只需拨打sortrows,即可创建一个代表您固定模式的视频演示文稿的附加数字列,从而完成此操作。这个附加列将简单地用连续的整数标记每组4行。它可以是concatenated to the beginning of the table,然后您可以按第一列和第三列排序以获得所需的顺序:

[~, index] = sortrows([table(ceil((1:size(T, 1)).'./4)) T], [1 3]);
T = T(index, :);

输出:

T = 

    ID    Audio     Video      Rating
    __    _____    ________    ______

    1     1        'Forest'     40   
    1     2        'Forest'     60   
    1     3        'Forest'     20   
    1     4        'Forest'    100   
    1     1        'City'       40   
    1     2        'City'       50   
    1     3        'City'       10   
    1     4        'City'        7   
    1     1        'Inside'     22   
    1     2        'Inside'     58   
    1     3        'Inside'     35   
    1     4        'Inside'     90

答案 1 :(得分:1)

使用reshapesort即可:

[~,idx]=sort(reshape(Audio_Version,4,[]));
idxtble = bsxfun(@plus,idx,0:4:(4*size(idx,2))-1);
table2 = table1(idxtble,:);

说明:

您可以提取音频列并将其重新整形为[4 * n]矩阵:

audio =  reshape(Audio_Version,4,[]);

然后对音频列进行排序并获取已排序元素的索引:

[~,idx]=sort(audio);

此处idx表示已排序元素的行号。

idx转换为表格整列的线性索引:

 idxtbl = bsxfun(@plus,idx,0:4:(4*size(idx,2))-1);

重新排序表:

table2 = table1(idxtbl,:);

答案 2 :(得分:0)

只需将sortrow用于表格的指定部分,如下所示:

table(1:4,:) = sortrow(table(1:4,:), 2);
table(4:8,:) = sortrow(table(4:8,:), 2);
table(8:12,:) = sortrow(table(8:12,:), 2);

首先对表格的一部分进行排序,然后将其替换为该部分。