2013-01-25 25 views
11

Tôi đang làm việc trên một số bài tập về nhà Matlab và tôi đang gặp vấn đề về khái niệm cách nó giải quyết ma trận. Trong Matlab ma trận là địa chỉ ở định dạng d(row,col).Các mảng nên được coi là cấu trúc ngang hoặc dọc

Tôi đã lập trình được một thời gian và luôn có xu hướng nghĩ về mảng một chiều dưới dạng cấu trúc ngang với thứ nguyên thứ hai kéo dài từ bên dưới.

nào sau đây là một "chính xác hơn" cách suy nghĩ về một cấu trúc dữ liệu mảng từ quan điểm của máy tính của xem

Trả lời

15

Câu hỏi 1.

Hoàn toàn từ góc độ lập trình Matlab, tốt nhất là nghĩ về ma trận dưới dạng chuỗi vectơ cột. Tại sao? Bởi vì đây là cách Matlab phân bổ chúng vào bộ nhớ máy tính của bạn. Tức là, hai phần tử tuần tự trong bất kỳ cột nào của ma trận sẽ được cấp phát bên cạnh nhau trong bộ nhớ. Điều này đôi khi được gọi là "thứ tự cột lớn" và được sử dụng trong các ngôn ngữ như Fortran, R và Julia. Ngược lại, không ngạc nhiên, được gọi là "thứ tự hàng lớn", và được sử dụng trong C và Python.

Ý nghĩa của việc này là Matlab sẽ nhanh hơn nhiều khi thực hiện các hoạt động trên các cột của ma trận hơn là trên các hàng. @angainor đã cung cấp một số great answer cho câu hỏi của tôi cách đây vài tháng để chứng minh điều này. Dựa trên cái nhìn sâu sắc @ angainor của, đây là một thử nghiệm tốc độ hữu ích để chạy:

M = 1000; %# Number of iterations over each method 
T = 1000; %# Number of rows 
N = 1000; %# Number of columns 

X = randn(T, N); %# Random matrix 

%# Loop over the rows of a matrix and perform a sum operation on each row vector 
tic 
for m = 1:M 
    for t = 1:T 
     sum(X(t, :)); 
    end 
end 
toc 

%# Loop over the columns of a matrix and perform a sum operation on each column vector 
tic 
for m = 1:M 
    for n = 1:N 
     sum(X(:, n)); 
    end 
end 
toc 

Trên máy tính của tôi, kết quả của các thử nghiệm là:

Elapsed time is 9.371870 seconds. %# Looping over rows 
Elapsed time is 1.943970 seconds. %# Looping over columns 

Nói cách khác, các hoạt động thực hiện trên cột gần như Nhanh hơn 5 lần so với các hoạt động được thực hiện trên hàng!

Từ góc độ toán học, tôi không tin tưởng bản thân mình để đưa ra câu trả lời hay. Bạn có thể nhận được một số thông tin chi tiết tuyệt vời từ math.stackexchange.

+0

Về mặt toán học, quy ước cũng sử dụng vectơ cột. Điều này có nghĩa rằng một sản phẩm bên trong được viết dưới dạng wT X (trong đó T là transpose, w là một vector cột và X là một ma trận). Bạn có thể làm theo cách khác, nhưng bạn phải đảo ngược thứ tự đó ở mọi nơi bạn thấy nó, và cách này hữu ích hơn cho hầu hết các biểu thức phức hợp. –

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