私はMatlabの宿題に取り組んでいますが、マトリックスに対処する方法を概念化する問題がありました。 Matlabではマトリックスはd(row,col)
フォーマットのアドレスです。配列は水平構造または垂直構造と考えるべきです
私はしばらくの間プログラミングされており、常に下から2番目の次元を持つ水平構造として1次元配列を考える傾向がありました。ビュー
私はMatlabの宿題に取り組んでいますが、マトリックスに対処する方法を概念化する問題がありました。 Matlabではマトリックスはd(row,col)
フォーマットのアドレスです。配列は水平構造または垂直構造と考えるべきです
私はしばらくの間プログラミングされており、常に下から2番目の次元を持つ水平構造として1次元配列を考える傾向がありました。ビュー
良い質問1のコンピュータの観点から配列について考える「より正しい」方法ですこれらの
。
純粋にMatlabプログラミングの観点からは、行列を列ベクトルのシーケンスと考えることが最善です。どうして?これがMatlabがあなたのコンピュータのメモリにそれらを割り当てる方法です。つまり、行列の任意の列の2つの連続した要素は、メモリ内で互いに隣り合って割り当てられます。これは、「列優先順位」と呼ばれることもあり、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は行列)と書かれています。あなたはそれを他の方法で行うこともできますが、それを見てどこでもその順序を逆にしなければなりません。この方法は、ほとんどの複合式にとってより便利です。 –