4

短縮版

次のようなマトリックスがある場合:

1  2
3  4

メモリには、[1 2 3 4]または として保存されますか[1 3 2 4]。言い換えれば、行列は行または列のアクセスに対してより最適化されていますか?


ロングバージョン

一部のコードを Matlab から NumPy に変換しています。私は、NumPy arrays のデフォルトである多次元配列の C 規則 (つまり、最後のインデックスが非常に迅速に、行列が行ごとに格納される) に慣れています。ただし、Matlab コードでは、次のようなスニペットが常に表示されます (複数の色付きの画像を単一の多次元配列に配置するため)。

images(:, :, :, i) = im

これは、C 規則では最適ではなく、FORTRAN 規則ではより最適化されているように見えます (最初のインデックスは非常に高速で、行列は列ごとに格納されます)。では、Matlab がこの 2 番目のスタイルを使用し、列操作に対してより最適化されているのは正しいでしょうか?

4

2 に答える 2

-1
%% Columns
n = 4000;

a = rand(n);
b = zeros(n,1);
tic
for j = 1 : 10
 for ii = 1:n
  b = b + a(:,ii);
 end
end
toc


%% Rows new:
a = rand(n);
b = zeros(1,n);
tic
for j = 1 : 10
 for ii = 1:n
  b = b + a(ii);
 end
end
toc

%% Rows old:
a = rand(n);
b = zeros(1,n);
tic
for j = 1 : 10
 for ii = 1:n
  b = b + a(ii,:);
 end
end
toc

結果:

経過時間は 1.53509 秒です。

経過時間は 1.03306 秒です。

経過時間は 3.4732 秒です。

したがって、行での作業は列での作業よりもわずかに高速であるように見えますが、:を使用すると速度が低下します。

于 2016-05-13T06:41:48.533 に答える