2013-01-25 71 views
11

我正在研究一些Matlab作業,並且遇到了將它解決矩陣的方式概念化的問題。在Matlab中矩陣的地址格式爲d(row,col)應該將數組視爲水平或垂直結構

我已經編程了一段時間,並一直傾向於將一維數組看作一個水平結構,其二維從下面伸出。

哪一個是想從電腦的角度來看

回答

15

問得好+1的數組的「更正確」的方式。

純粹從Matlab編程的角度來看,最好將矩陣看作是一個列向量序列。爲什麼?因爲這是Matlab如何將它們分配給你的計算機內存。也就是說,矩陣的任意給定列中的兩個連續元素將在內存中彼此相鄰分配。這有時被稱爲「列主要順序」,並用於諸如Fortran,R和Julia等語言。毫無疑問,反過來,它被稱爲「行 - 主要順序」,並在C和Python中使用。

這意味着Matlab在矩陣的列上執行操作要比在行上操作快得多。 @angainor在幾個月前提出了一個great answer來證明這個事實。根據@ angainor的洞察,這裏是一個有用的速度測試運行:

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 

在我的機器,測試的結果是:

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

換句話說,在列上執行的操作幾乎比行上的操作快5倍!

從數學的角度來說,我不相信自己會給出一個很好的答案。你可能會從math.stackexchange得到一些很好的見解。

+0

在數學上,約定也是使用列向量。這意味着內積寫成wT X(其中T是轉置,w是列向量,X是矩陣)。你可以用另一種方式來做,但是你必須在任何你看到它的地方反轉這個順序,這種方法對於大多數複合表達式來說更有用。 –