2013-01-25 11 views
11

Pracuję nad niektórymi zadaniami domowymi Matlab i miałem problemy z konceptualizacją sposobu, w jaki adresuje on matryce. W Matlab macierz jest adresem w formacie d(row,col).Czy tablice powinny być traktowane jako struktury poziome lub pionowe?

Programowałem przez jakiś czas i zawsze miałem tendencję do myślenia o układzie jednowymiarowym jako strukturze poziomej z drugim wymiarem rozciągającym się od dołu.

Która z nich jest bardziej „poprawny” sposób myślenia o strukturze danych tablicą z punktu widzenia komputera

Odpowiedz

15

Dobre pytanie +1.

Czysto z perspektywy programowania Matlaba najlepiej jest myśleć o macierzy jako sekwencji wektorów kolumnowych. Czemu? Ponieważ w ten sposób Matlab przydziela je do pamięci komputera. Oznacza to, że dwa kolejne elementy w dowolnej kolumnie macierzy zostaną przydzielone obok siebie w pamięci. Jest to czasami określane jako "kolumna-główne zamówienie" i jest używane w językach takich jak Fortran, R i Julia. Odwrotnie jest, co nie jest zaskakujące, nazywane "rzędowo-głównym porządkiem" i jest używany w językach C i Python.

Wynika z tego, że Matlab będzie znacznie szybszy w wykonywaniu operacji na kolumnach macierzy niż w wierszach. @angainor pod warunkiem great answer na moje pytanie kilka miesięcy temu, który pokazuje ten fakt. Na podstawie wglądu @ angainor, oto jest użytecznym Test prędkości do uruchomienia:

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 

na moim komputerze, wynik testu jest:

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

Innymi słowy, operacje wykonywane na kolumnach są prawie 5 razy szybciej niż operacje wykonywane na rzędach!

Z matematycznego punktu widzenia nie ufam sobie, aby dać dobrą odpowiedź. Prawdopodobnie możesz uzyskać dobre spostrzeżenia z math.stackexchange.

+0

Matematycznie, konwencja ma również wykorzystywać wektory kolumnowe. Oznacza to, że produkt wewnętrzny jest zapisany jako WT X (gdzie T jest transpozycją, w jest wektorem kolumny, a X jest macierzą). Możesz zrobić to w inny sposób, ale musisz odwrócić tę kolejność wszędzie, gdzie ją zobaczysz, a ta metoda jest bardziej przydatna w przypadku większości wyrażeń złożonych. –

Powiązane problemy