2012-10-21 62 views

Trả lời

28

Có một số sự khác biệt giữa một mảng tế bào và một ma trận trong MATLAB:

  • Một mảng tế bào có thể chứa bất kỳ loại độc đoán của phần tử trong mỗi tế bào; trong khi ma trận yêu cầu các loại phần tử của nó phải đồng nhất tức là cùng loại.

  • Theo như bố cục bộ nhớ, tất cả các phần tử của ma trận được đặt liền kề nhau trong bộ nhớ, trong khi mảng ô có chứa con trỏ tới từng phần tử của mảng. Điều này có thể quan trọng khi xem xét những thứ như vùng nhớ cache cho mã hiệu suất cao. Mặt bên của điểm 2 là khi bạn thay đổi kích thước ma trận, mọi phần tử trong ma trận phải được sao chép sang vùng bộ nhớ mới được phân bổ, nhưng trong trường hợp một mảng ô chỉ có một danh sách các con trỏ cần được sao chép . Tùy thuộc vào kích thước và loại phần tử bạn đang lưu trữ, điều này có nghĩa là các mảng ô được thay đổi kích thước nhanh hơn nhiều.


Để minh họa sự khác biệt trong cách bố trí bộ nhớ, chúng ta hãy xem xét một ví dụ đơn giản:

A = [10 20 30 40]; 

Đây MATLAB tạo ra một biến ma trận mới có tên A, phân bổ đủ bộ nhớ để giữ 4 đôi (32 byte, giả sử 8 byte tăng gấp đôi) và gán bộ nhớ này cho con trỏ trỏ tới phần thực của A. (Nếu bạn tạo ma trận số phức, bộ nhớ cũng được phân bổ cho phần tưởng tượng, và một con trỏ riêng trỏ đến vùng bộ nhớ này).

Bây giờ hãy tạo một mảng tế bào chứa các yếu tố:

B = cell(1, 4); 
B{1,1} = 10; 
B{1,2} = 20; 
B{1,3} = 30; 
B{1,4} = 40; 

Khi MATLAB thực hiện báo cáo kết quả đầu tiên, nó tạo ra một mảng tế bào có chứa 4 con trỏ, mỗi trong số đó có thể trỏ đến một kiểu bất kỳ. Vì vậy, B đã sử dụng 16 byte (giả sử con trỏ 32 bit). Dòng tiếp theo tạo ma trận 1x1 chứa giá trị 10 và gán nó cho phần tử mảng ô đầu tiên. Quá trình ở đây tương tự như quy trình tôi đã mô tả ở trên để tạo ma trận 1x4, ngoại trừ bộ nhớ được cấp chỉ đủ lớn để giữ một đôi (8 byte). Điều này được lặp lại cho mỗi câu lệnh còn lại. Vì vậy, ở mức tối thiểu, ví dụ thứ hai sử dụng 16 + 8 x 4 = 48 byte. Lưu ý rằng mỗi biến trong MATLAB cũng bao gồm chi phí bộ nhớ cho một cấu trúc được gọi là mxArray lưu trữ thông tin như thứ nguyên, loại dữ liệu và nhiều thông tin khác về biến đó. Tôi đã bỏ qua chi phí này vì mục đích đơn giản.

+1

Một vài điều ... Đó là một chút cụ thể hơn để nói rằng một mảng tế bào như B là lưu trữ con trỏ mỗi se. Về mặt khái niệm, các tế bào giống như con trỏ, nhưng Matlab không ghi lại cách chúng được thực hiện bên trong 'mxArray'. Chúng tôi chỉ biết nó lưu trữ một cái gì đó với một số chi phí trong đó. Matlab sẽ cho bạn biết một cái gì đó về bao nhiêu chi phí: làm 'a = []; c = {a}; whos', và Matlab sẽ báo cáo một số byte được sử dụng bởi c. Tôi nghĩ đó là khoảng bao nhiêu tiền trên mỗi mxarray. –

+1

...Và thực tế là nó báo cáo theo cách đó, kết hợp với việc xem xét các địa chỉ trong trình gỡ rối và định dạng tệp MAT và cứ thế, cho tôi biết rằng ô mxArrays thực sự có thể lưu trữ trực tiếp mảng C của cấu trúc mxArray (phần đầu của nó), thay vì con trỏ. –

+0

Ngoài ra, tôi biết điều này là nitpicky, nhưng mỗi giá trị mảng nguyên thủy hoặc tổng hợp * trong Matlab có mxArray, không phải mỗi biến. B là một biến. Nó chứa một mảng ô 4-dài và mỗi phần tử ô chứa một mảng kép. Vì vậy, cấu trúc dữ liệu của B có 5 mxArrays trong đó. Đây là lý do tại sao các tế bào và cấu trúc có thể kết thúc bằng cách sử dụng rất nhiều chi phí, bạn có thể ước tính bằng cách sử dụng chi phí cho mỗi mxarray được đề xuất bởi 'whos'. –

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