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使用第二种风格并且针对列操作进行了更好的优化是否正确?
简答:它是按列存储的.
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倍以上!
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |