2017-06-15 564 views
1

我在Matlab中有一個表格,其中包含來自不同測試人員的測試數據。該測試有七個視頻剪輯,每個視頻剪輯都有四種不同的音頻版本,測試人員必須按照1到100的等級進行評分。爲了統計準確性,每個視頻剪輯都會出現兩次。測試人員按下接口上的按鈕1-4以聽到不同的音頻版本。如何在Matlab中對錶格的部分進行排序?

我的表包含以下幾列(其中包括一些其他不相關的問題):

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 

我最初的想法是使用sortrow()功能在Matlab中,然後與沿遞增對它們進行排序視頻剪輯,但由於視頻剪輯在測試的不同階段被引入兩次,我想維護表格中剪輯的相同順序不起作用。同樣的視頻剪輯也會呈現給衆多不同的測試人員。

我正在使用預製功能,必須以這種方式對數據進行排序才能對其執行統計計算。該函數從結構中獲取Matlab數據,並通過for循環行將其放入表中。

因爲數據是通過一個for循環我認爲有可能在同一時間內一個辦法只能固定數量的行排序放入表即行1-4,5-8,9-12等等。 你知道是否有一種方法只能在Matlab中對一部分表格進行排序?

回答

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,:); 
+0

謝謝您的回答。我從idx得到預期的輸出,即根據我的表中的順序包含從1-4的索引的很多4行列。儘管'idxtble'雖然我不完全理解第二行。 當我嘗試運行該行時,它表示「兩個輸入數組的非單獨維度必須相互匹配」。我刪除了四個增量,從而將該行更改爲'idxtble = bsxfun(@ plus,idx,0:4:size(idx,2)-1);'(我認爲是您的原始答案),但是當我我最終以table2爲單個數值。 – matiastofteby

+0

@matiastofteby對不起,延遲迴復。你是對的。已更新。 – rahnema1

+0

非常感謝!更新後的版本正如我所希望的那樣工作。我現在已經接受了你的回答。祝你有美好的一天。 – matiastofteby

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); 

首先排序表中的部分,然後用這部分更換。

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 
+0

非常感謝答案 - 它看起來乾淨而簡單。然而,在這個例子中,我不完全確定你使用'T'和table。如果表格是我已經感興趣的表格,那麼我在哪裏/如何聲明T? – matiastofteby

+1

@matiastofteby:'T'是你現有的桌子。只需將其替換爲存儲表格的任何變量即可。 – gnovice

相關問題