2014-09-22 118 views
5

目前我試圖洗牌1×N個細胞使用follwoing代碼陣列在Matlab的內容:洗牌單元陣列(Matlab的)

shuffledframes = frames{randperm(NumberOfFrames)}; 
frames=shuffledframes; 

%printing cell array contents 
for i=1:NumberOfFrames 
    frames(i) 
end 

然而幀內容似乎沒有suffle ...

在代碼中有沒有錯誤,我沒有看到?

+0

只是一個旁註,而不是你用來顯示所有值循環你也可以使用:'frames {:}' – 2014-09-22 14:23:17

回答

7

您需要通過以下任一來取代

shuffledframes = frames{randperm(NumberOfFrames)}; 

  1. 標準,推薦的方法:

    shuffledframes = frames(randperm(NumberOfFrames)); 
    
  2. 更復雜的使用替代列表:

    [frames{:}] = frames{randperm(NumberOfFrames)}; 
    

爲什麼?在你的原始代碼中,frames{randperm(NumberOfFrames)}給出了一個comma-separated list的數字。 Matlab只需要該列表的第一個數字並將其分配給shuffledframes

在上面的方法1中,frames(randperm(NumberOfFrames))使用索引向量索引原始單元陣列以生成新的單元陣列,這正是您想要的。

方法2具有相同的預期效果,雖然它不必要地更復雜。它通過將一個列表與另一個列表進行匹配。即,Matlab分別用列表frames{randperm(NumberOfFrames)}的每個值填充列表frames{:}的每個值。

爲了更清楚地看到這一點,觀察你的代碼的第一行的右側,並與方法1比較:

>> frames = {1,2,3,4}; 
>> NumberOfFrames = 4; 
>> frames{randperm(NumberOfFrames)} %// Your code. Gives a list of values. 
ans = 
    3 
ans = 
    4 
ans = 
    2 
ans = 
    1 

>> frames(randperm(NumberOfFrames)) %// Approach 1. Gives cell array. 
ans = 
    [3] [1] [4] [2] 
+0

這對於單元數組是否仍然有效? – asterix 2014-09-22 14:01:45

+0

@asterix我編輯了我的答案,使其更清晰 – 2014-09-22 14:21:19