gpt4 book ai didi

matlab - 通过 = [] 删除矩阵元素与重新分配矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:29 26 4
gpt4 key购买 nike

Matlab中这两种删除元素的方法有什么区别吗:

ElementsToDelete = [0 0 1 0 1 0 0 1 1 0]

A = 1:10
A(ElementsToDelete) = []

%Versus

A = 1:10
A = A(~ElementsToDelete)

是否有时一种方法比另一种方法更合适?效率有区别吗?或者它们完全可以互换?

最佳答案

试试这个:

A = rand(1e3, 1);
b = A<0.5;

tic;
for ii = 1:1e5
a = A;
a(b) = [];
end
toc

tic;
for ii = 1:1e5
a = A;
a = a(~b);
end
toc

结果:

Elapsed time is 1.654146 seconds
Elapsed time is 1.126325 seconds

所以差异是 1.5 的速度因子有利于重新分配。然而,这更糟:

A = rand(1e4, 1);

stop = 0;
for jj = 1:10
a = A;
start = tic;
for ii = 1:1e5
a(a < rand) = [];
end
stop = stop + toc(start);
end
avg1 = stop/10


stop = 0;
for jj = 1:10
a = A;
start = tic;
for ii = 1:1e5
a = a(a > rand);
end
stop = stop + toc(start);
end
avg2 = stop/10

avg1/avg2

结果:

avg1 = 1.1740235 seconds
avg2 = 0.1850463 seconds

avg1/avg2 = 6.344485136963019

因此,该因子增加到远远超过 6。

我的猜测是,删除(即用 [] 赋值)会在内部循环中每次出现 true 时重写整个数组逻辑索引。这是无可救药的低效,正如这样测试时显而易见的那样。另一方面,重新分配可以预先确定新数组的大小并相应地对其进行初始化;无需重写。

为什么 JIT 不将一个编译成另一个对我来说是个谜,因为删除是一种更直观的符号恕我直言。但是,如您所见,它与替代方案相比效率低下,因此应谨慎使用。 切勿在循环内使用它!

关于matlab - 通过 = [] 删除矩阵元素与重新分配矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com