我在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中只对表的一部分进行排序?
答案 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)
使用reshape
和sort
即可:
[~,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);
首先对表格的一部分进行排序,然后将其替换为该部分。