例如,我有一个3乘4乘5的数组m
。
如果我有频率操作,如
m(:,:,rr) = a
我应该将rr
放在订阅的三个位置?
换句话说,哪个更快?
m(rr,:,:) = a
其中m
是一个3乘4乘5的数组
或
m(:,:,rr) = a
其中m
是一个4乘5乘3的数组
答案 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.