【问题标题】:How to sort parts of table in Matlab?如何在 Matlab 中对表格的部分进行排序?
【发布时间】:2017-06-15 13:02:25
【问题描述】:

我在 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

我想要做的是:保持视频剪辑的正确顺序,因此仍然有 Forest -> City -> Inside,但它们都已排序,因此始终是音频版本 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 循环 row for row 将其放入表中。

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

【问题讨论】:

    标签: matlab sorting


    【解决方案1】:

    您可以通过创建一个额外的数字列来表示您的固定视频演示模式,只需调用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
    

    【讨论】:

    • 非常感谢您的回答 - 它看起来确实干净简单。但是,我不完全确定您在此示例中使用“T”与表格。如果表是我已经存在的表,那么我在哪里/如何声明 T?
    • @matiasofteby:T 是您现有的表。只需将其替换为存储表的任何变量即可。
    【解决方案2】:

    使用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,:);
    

    【讨论】:

    • 感谢您的回答。我从 idx 得到预期的输出,即很多 4 行列,根据我的表中的顺序包含 1-4 的索引。尽管使用 'idxtble' 我并不完全理解第二行。当我尝试运行该行时,它显示“两个输入数组的非单一维度必须相互匹配”。我删除了四的增量,因此将行更改为idxtble = bsxfun(@plus,idx,0:4:size(idx,2)-1);(我认为这是您的原始答案),但是当我这样做时,我最终得到 table2 是一个单一的数值。
    • @matiastofteby 抱歉回复晚了。你是对的。答案已更新。
    • 非常感谢!更新的版本就像我希望的那样工作。我现在已经接受了你的回答。祝你有美好的一天。
    • 很高兴能帮上忙!
    【解决方案3】:

    只需将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);
    

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

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多