2010-04-12 35 views
6

Tôi cần phải tạo một hàng đợi trong khung nền giữ cấu trúc rất lớn. Tôi không biết hàng đợi này sẽ lớn như thế nào. Matlab không có danh sách liên kết, và tôi lo lắng rằng việc phân bổ lặp lại và sao chép thực sự sẽ làm chậm mã này mà phải được chạy hàng ngàn lần. Tôi cần một số cách để sử dụng cấu trúc dữ liệu có thể phát triển. Tôi đã tìm thấy một vài mục cho danh sách liên kết trong trợ giúp MATLAB nhưng tôi không thể hiểu những gì đang xảy ra. ai đó có thể giúp tôi vấn đề này không?Cấu trúc dữ liệu có thể phát triển trong MATLAB

Trả lời

2

Vâng, tôi tìm thấy câu trả lời đơn giản:

L = java.util.LinkedList; 
2

Nếu bạn lo lắng việc phân bổ lặp lại và sao chép sẽ làm chậm mã xuống, hãy thử. Nó có thể trong thực tế là rất chậm, nhưng bạn có thể ngạc nhiên.

Beware of premature optimization.

+0

Đáng buồn thay, tôi không biết về một hồ sơ MATLAB. – rlbond

+5

@rlbond: Thật là buồn. Nếu bạn muốn tìm hiểu nó, hãy vào menu 'Desktop' của Matlab, và mở profiler. – Jonas

3

Chỉ cần tạo một mảng của cấu trúc và tăng gấp đôi kích thước của mảng khi nó chạm đến giới hạn. Điều này cân tốt.

+0

Các cấu trúc được triển khai như thế nào? Di chuyển mảng chỉ có nghĩa là sao chép con trỏ? – rlbond

+0

Theo như tôi biết mọi thứ trong Matlab là dữ liệu. Vì vậy, struct chỉ là dữ liệu. Và bạn không "di chuyển mảng". Chỉ cần tăng gấp đôi kích thước của mảng hiện có. 'x (2 * length (x)) = ... của bạn 'trống' struct' – Pyrolistical

+0

@rlbond: Có, MATLAB cấu ​​trúc và các tế bào không chứa dữ liệu riêng của mình nhưng con trỏ đến dữ liệu để tất cả các hoạt động có giá rẻ. – Mikhail

6

Tôi đã đăng a solution một lúc trở lại vấn đề tương tự. Cách tôi đã thử nó là bằng cách phân bổ mảng với kích thước ban đầu BLOCK_SIZE, và sau đó tôi tiếp tục phát triển nó bằng cách BLOCK_SIZE khi cần thiết (bất cứ khi nào có ít hơn 10%*BLOCK_SIZE vùng trống miễn phí).

Lưu ý rằng với kích thước khối phù hợp, hiệu suất có thể so sánh với việc phân bổ trước toàn bộ mảng ngay từ đầu. Xin vui lòng xem các bài viết khác cho một chuẩn mực đơn giản tôi đã làm.

1

Tôi nghĩ rằng được xây dựng trong cell cấu trúc sẽ phù hợp để lưu trữ cấu trúc growable. tôi đã thực hiện một so sánh giữa:

  • tế bào kích thước động, kích thước của tế bào thay đổi mỗi vòng lặp
  • Pre-phân bổ tế bào
  • Java LinkedList

Code:

clear; 
scale = 1000; 

% dynamic size cell 
tic; 
dynamic_cell = cell(0); 
for ii = 1:scale 
    dynamic_cell{end + 1} = magic(20); 
end 
toc 

% preallocated cell 
tic; 
fixed_cell = cell(1, scale); 
for ii = 1:scale 
    fixed_cell{ii} = magic(20); 
end 
toc 

% java linked list 
tic; 
linked_list = java.util.LinkedList; 
for ii = 1:scale 
    linked_list.add(magic(20)); 
end 
toc; 

Kết quả:

Elapsed time is 0.102684 seconds. % dynamic 
Elapsed time is 0.091507 seconds. % pre-allocated 
Elapsed time is 0.189757 seconds. % Java LinkedList 

Tôi thay đổi scalemagic(20) và tìm phiên bản động và được phân bổ trước rất gần với tốc độ. Có lẽ tế bào chỉ lưu trữ cấu trúc giống như con trỏ và hiệu quả khi thay đổi kích thước. Cách Java chậm hơn. Và đôi khi tôi thấy nó không ổn định (nó làm hỏng MATLAB của tôi khi tỉ lệ rất lớn).

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