我正在研究一些Matlab作業,並且遇到了將它解決矩陣的方式概念化的問題。在Matlab中矩陣的地址格式爲d(row,col)
。應該將數組視爲水平或垂直結構
我已經編程了一段時間,並一直傾向於將一維數組看作一個水平結構,其二維從下面伸出。
哪一個是想從電腦的角度來看
我正在研究一些Matlab作業,並且遇到了將它解決矩陣的方式概念化的問題。在Matlab中矩陣的地址格式爲d(row,col)
。應該將數組視爲水平或垂直結構
我已經編程了一段時間,並一直傾向於將一維數組看作一個水平結構,其二維從下面伸出。
哪一個是想從電腦的角度來看
問得好+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得到一些很好的見解。
在數學上,約定也是使用列向量。這意味着內積寫成wT X(其中T是轉置,w是列向量,X是矩陣)。你可以用另一種方式來做,但是你必須在任何你看到它的地方反轉這個順序,這種方法對於大多數複合表達式來說更有用。 –