私はいくつかのMatlabの宿題に取り組んでおり、それが行列に対処する方法を概念化するのに問題がありました。Matlabでは、行列はアドレスd(row,col)
形式です。
私はしばらくプログラミングをしていて、常に1次元配列を、2次元が下から伸びている水平構造と考える傾向がありました。
コンピュータの観点から配列データ構造について考える「より正しい」方法はどれですか。
私はいくつかのMatlabの宿題に取り組んでおり、それが行列に対処する方法を概念化するのに問題がありました。Matlabでは、行列はアドレスd(row,col)
形式です。
私はしばらくプログラミングをしていて、常に1次元配列を、2次元が下から伸びている水平構造と考える傾向がありました。
コンピュータの観点から配列データ構造について考える「より正しい」方法はどれですか。
良い質問 +1。
純粋に Matlab プログラミングの観点からは、行列を列ベクトルのシーケンスと考えるのが最善です。なんで?これは、Matlab がそれらをコンピュータのメモリに割り当てる方法だからです。つまり、行列の特定の列にある 2 つの連続する要素は、メモリ内で隣り合わせに割り当てられます。これは「列優先順」と呼ばれることもあり、Fortran、R、Julia などの言語で使用されます。当然のことながら、その反対は「行優先順」と呼ばれ、C と Python で使用されます。
これが意味することは、Matlab は行よりも行列の列で操作を実行する方がはるかに高速になるということです。@angainor は、数か月前の私の質問に対して、この事実を示す素晴らしい回答を提供してくれました。@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から素晴らしい洞察を得ることができるでしょう。