矩阵如何存储在Matlab/Octave中?

ffr*_*end 4 arrays matlab numpy matrix octave

精简版

如果我有这样的矩阵:

1  2
3  4
Run Code Online (Sandbox Code Playgroud)

在内存中,是存储为[1 2 3 4]还是存储[1 3 2 4].换句话说,矩阵是否针对列访问进行更优化


长版

我正在将一些代码从Matlab翻译成NumPy.我习惯于多维数组的C约定(即最后的索引最快,矩阵按行存储),这是NumPy数组的默认值.但是,在Matlab代码中,我一直看到这样的片段(用于在单个多维数组中排列几个彩色图像):

images(:, :, :, i) = im
Run Code Online (Sandbox Code Playgroud)

对于C约定来说看起来不是最理想的,并且对FORTRAN约定更加优化(第一个索引最快速,矩阵按列存储).那么,Matlab使用第二种风格并且针对列操作进行了更好的优化是否正确?

Ste*_*fin 5

简答:它是按列存储的.

A = [1 2; 3 4];
A(:) = [1; 3; 2; 4];
Run Code Online (Sandbox Code Playgroud)

在许多情况下,如果以"正确的顺序"进行计算,并且对完整列而不是行进行操作,性能会好得多.

一个简单的例子:

%% Columns
a = rand(n);
b = zeros(n,1);
tic
for ii = 1:n
  b = b + a(:,ii);
end
toc
Elapsed time is 0.252358 seconds.

%% Rows:
a = rand(n);
b = zeros(1,n);
tic
for ii = 1:n
  b = b + a(ii,:);
end
toc
Elapsed time is 2.593381 seconds.
Run Code Online (Sandbox Code Playgroud)

在列上工作时,速度提高10倍以上!