2013-01-25 7 views
11

私はMatlabの宿題に取り組んでいますが、マトリックスに対処する方法を概念化する問題がありました。 Matlabではマトリックスはd(row,col)フォーマットのアドレスです。配列は水平構造または垂直構造と考えるべきです

私はしばらくの間プログラミングされており、常に下から2番目の次元を持つ水平構造として1次元配列を考える傾向がありました。ビュー

答えて

15

良い質問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から素晴らしい洞察を得ることができます。

+0

数学的には、慣習は列ベクトルを使用することもあります。これは、内積がwT X(Tは転置、wは列ベクトル、Xは行列)と書かれています。あなたはそれを他の方法で行うこともできますが、それを見てどこでもその順序を逆にしなければなりません。この方法は、ほとんどの複合式にとってより便利です。 –