正如标题所说,我想知道Matlab在这两个选项之间做了哪些不同的事情。为了论证,我们假设矩阵a
和idx
足以处理内存问题,并定义:
a(idx) = []
a = a(~idx)
我的直觉说在案例A执行值重新分配,然后CPU需要处理从原始位置到新的有序位置的索引副本,同时跟踪同一矩阵的当前“头部”,以及以后修剪多余的记忆。
另一方面,案例B将对新分配的内存空间执行索引批量复制。
所以案例A可能比案例B慢,但内存要求更低。我是否正确?我不知道,在写完这篇文章之后,我觉得案例B需要首先执行案例A ......有什么想法吗?
提前致谢
答案 0 :(得分:0)
这很有趣,所以我决定采取措施:
我正在使用Matlab R2016a的Windows(64位)版本 CPU:Core i5-3550,频率为3.3GHz。 内存:8GB DDR3 1333(双通道)。
len = 100000000; %Number of elements in array (make it large enouth to be outsize of cache memory).
idx = zeros(len, 1, 'logical'); %Fill idx with ones.
idx(1:10:end) = 1; %Put 1 in every 10'th element of idx.
a = ones(len, 1); %Fill arrary a with ones.
disp('Measure: a(idx) = [];')
tic
a(idx) = [];
toc
a = ones(len, 1);
disp(' ');disp('Measure: a = a(~idx);')
tic
a = a(~idx);
toc
disp(' ');disp('Measure: not_idx = ~idx;')
tic
not_idx = ~idx;
toc
a = ones(len, 1);
disp(' ');disp('Measure: a = a(not_idx);')
tic
a = a(not_idx);
toc
结果:
Measure: a(idx) = [];
Elapsed time is 1.647617 seconds.
Measure: a = a(~idx);
Elapsed time is 0.732233 seconds.
Measure: not_idx = ~idx;
Elapsed time is 0.032649 seconds.
Measure: a = a(not_idx);
Elapsed time is 0.686351 seconds.
结论:
a = a(~idx)
比a(idx) = []
快两倍。a = a(~idx)
的总时间等于not_idx = ~idx
加上a = a(not_idx)
的总和
Matlab可能单独计算~idx
,因此消耗更多内存
内存消耗仅在物理RAM完全消耗时计量
我认为它可以忽略不计(~idx
内存消耗是暂时的。)