如何在多维数组中排列维度顺序以获得最短的运行时间?

时间:2014-03-10 14:20:45

标签: matlab multidimensional-array

例如,我有一个3乘4乘5的数组m。 如果我有频率操作,如

m(:,:,rr) = a

我应该将rr放在订阅的三个位置?

换句话说,哪个更快?

m(rr,:,:) = a其中m是一个3乘4乘5的数组

m(:,:,rr) = a其中m是一个4乘5乘3的数组

2 个答案:

答案 0 :(得分:3)

尝试这样的事情:

n = 100000;
rr = randi(size(A,1), n, 1)

tic;
for k = 1:n
    A(rr(k),:,:) = k;
end
toc

tic;
for k = 1:n
    B(:,:,rr(k)) = k;
end
toc

我发现第一种方法要慢一点:

Elapsed time is 0.078342 seconds.
Elapsed time is 0.066406 seconds.

这对我来说很有意义,因为Matlab将矩阵分配给内存,因为数组首先沿着行向下(然后是列,然后是第3,第4个第5等维度)。此A(:,:,k)是一个连续的内存块,而A(k,:,:)则不是。

答案 1 :(得分:1)

第二种方式似乎更快,至少在a和rr是常数的情况下。

m1 = rand (300,400,500);
m2 = rand (400,500,300);
a = 3;
rr = 7;

tic
m1(rr,:,:) = a; % 3-by-4-by-5 array
toc

tic
m2(:,:,rr) = a ; % 4-by-5-by-3 array 
toc


Elapsed time is 0.002322 seconds.
Elapsed time is 0.000174 seconds.