目前我試圖洗牌1×N個細胞使用follwoing代碼陣列在Matlab的內容:洗牌單元陣列(Matlab的)
shuffledframes = frames{randperm(NumberOfFrames)};
frames=shuffledframes;
%printing cell array contents
for i=1:NumberOfFrames
frames(i)
end
然而幀內容似乎沒有suffle ...
在代碼中有沒有錯誤,我沒有看到?
目前我試圖洗牌1×N個細胞使用follwoing代碼陣列在Matlab的內容:洗牌單元陣列(Matlab的)
shuffledframes = frames{randperm(NumberOfFrames)};
frames=shuffledframes;
%printing cell array contents
for i=1:NumberOfFrames
frames(i)
end
然而幀內容似乎沒有suffle ...
在代碼中有沒有錯誤,我沒有看到?
您需要通過以下任一來取代
shuffledframes = frames{randperm(NumberOfFrames)};
:
標準,推薦的方法:
shuffledframes = frames(randperm(NumberOfFrames));
更復雜的使用替代列表:
[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]
這對於單元數組是否仍然有效? – asterix 2014-09-22 14:01:45
@asterix我編輯了我的答案,使其更清晰 – 2014-09-22 14:21:19
只是一個旁註,而不是你用來顯示所有值循環你也可以使用:'frames {:}' – 2014-09-22 14:23:17