gpt4 book ai didi

matlab - 从给定位置开始查找向量中第一个非零值的位置

转载 作者:太空宇宙 更新时间:2023-11-03 20:13:32 31 4
gpt4 key购买 nike

如果我有一个二进制向量x:

x = [1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0];

和一个位置(线性索引)p:

p = 7;

我想找到这个向量 x 中第一个非零值的位置,从位置 p 开始(并朝正方向移动):

x = [1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0];
↑ ↑
%starting position (7) %position to find (24)

可以用for循环来完成:

for ii = p:length(x)
if x(ii)~=0
ind = ii
break
end
end

但是否有更智能/更有效的方法来达到相同的结果?

最佳答案

快速计时测试:

  • method1 是 OP 中的循环。

  • method2this answer 的固定版本,使用 find 并复制数组。

  • (我没有添加 bwconncomp 答案,因为它慢得多)。

当然,测试结果取决于在找到非零元素之前要访问的预期元素数,以及数组长度 nq 是第一个非零元素的位置。我总是选择 p=10。以秒为单位的时间:

n       q       method1     method2
------ ------ ---------- ----------
1e3 p+5 5.9714e-07 2.8644e-06
1e3 end-5 3.9806e-06 3.3714e-06
1e6 p+5 6.4526e-07 0.0027
1e6 end-5 0.0029 0.0033

因此,find 方法的运行时间取决于复制数组和调用 find 的开销,而循环方法时间取决于数组元素的数量需要访问以找到第一个非零元素。


测试代码:

N = 1e6;
p = 10;
x = zeros(1,N);
%x(p+5) = 1;
x(end-5) = 1;
timeit(@()method1(x,p))
timeit(@()method2(x,p))


function ind = method1(x,p)
for ii = p:length(x)
if x(ii)~=0
ind = ii;
break
end
end
end

function ind = method2(x,p)
ind = find(x(p:end),1) + p-1;
end

关于matlab - 从给定位置开始查找向量中第一个非零值的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56037346/

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