2014-09-22 15 views
5

Tôi hiện đang cố gắng để shuffle nội dung của một 1 x N tế bào mảng trong matlab sử dụng mã follwoing:Xáo trộn một mảng di động (Matlab)

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

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

Tuy nhiên nội dung của frame dường như không suffle ...

Có lỗi trong mã không, tôi không thấy?

+0

Chỉ cần một sidenote, chứ không phải là vòng lặp bạn sử dụng để hiển thị tất cả các giá trị bạn cũng có thể sử dụng: 'frames {:}' –

Trả lời

7

Bạn cần phải thay

shuffledframes = frames{randperm(NumberOfFrames)}; 

bởi một trong những:

  1. tiêu chuẩn, đề nghị cách:

    shuffledframes = frames(randperm(NumberOfFrames)); 
    
  2. danh sách thay thế sử dụng phức tạp hơn:

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

Tại sao? Trong mã ban đầu của bạn, frames{randperm(NumberOfFrames)} cung cấp số comma-separated list số. Matlab chỉ lấy số đầu tiên của danh sách đó và gán nó cho shuffledframes.

Trong phương pháp 1 ở trên, frames(randperm(NumberOfFrames)) lập chỉ mục mảng ô ban đầu với một vectơ chỉ mục để tạo một mảng ô mới, đó là những gì bạn muốn.

Cách tiếp cận 2 có cùng hiệu quả mong muốn, mặc dù nó phức tạp hơn một cách không cần thiết. Nó hoạt động bằng cách kết hợp một danh sách với một danh sách khác. Cụ thể, Matlab tương ứng lấp đầy từng giá trị của danh sách frames{:} với mỗi giá trị của danh sách frames{randperm(NumberOfFrames)}.

Để thấy điều này rõ ràng hơn, quan sát phía bên tay phải của dòng đầu tiên của mã của bạn, và so sánh với phương pháp 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

Điều này vẫn có giá trị trong trường hợp mảng ô ?? – asterix

+0

@asterix Tôi đã chỉnh sửa câu trả lời của mình để làm rõ hơn –

Các vấn đề liên quan