更快的长度版本(find()),用于从矢量(MATLAB)的某个范围中选择元素

Kru*_*mar 0 matlab

我有1Xn单元格值的数组.我想计算matlab中给定范围内的值.我实现如下:

count1 = length(find(h{1}<ti & h{1}>ti-INT));
Run Code Online (Sandbox Code Playgroud)

h是我的单元格数组,我想要ti和ti-INT之间的值计数.

此实现提供了正确的结果,但速度非常慢.是否有更快的功能可用于指定的操作?

小智 5

对出现标志求和:

 count1 = sum(h{1}<ti & h{1}>ti-INT);
Run Code Online (Sandbox Code Playgroud)

我知道我会为MATLAB的神使用tictoc代码timig而烦恼,但是:

x = rand(10^7,1);
tic; sum(x>0.5); toc;
tic; nnz(x>0.5); toc;
tic; length(find(x>0.5)); toc;
Run Code Online (Sandbox Code Playgroud)

在几次运行中显示的速度sum()是两倍,比例快nnz()3倍length(find()):

Elapsed time is 0.049855 seconds.
Elapsed time is 0.120931 seconds.
Elapsed time is 0.162025 seconds.
Run Code Online (Sandbox Code Playgroud)

这是在我的R2012a上运行在带有i5 + 3Gb RAM的Windows机器上.

稍后编辑:

为了计算整个单元阵列中的元素,可以使用:

count_all = sum(cellfun(@(x) sum(x<ti & x>ti-INT), h));
Run Code Online (Sandbox Code Playgroud)

  • @KrunalParmar你试过吗?为了说明这个想法,想想你如何解决以下问题:找到数组中的一个数``[1 0 1 0 0 1 0 0 0 1]`知道只有1和0. (2认同)
  • 使用“nnz”代替“sum”。对于二进制数组,结果是相同的,但从概念上讲,最好使用 nnz。nzz 计算非零元素的数量(这就是我们想要的)。另一方面,sum 将向量的所有值相加。即使结果相同,nzz 在概念上更好。 (2认同)
  • @SembeiNorimaki 我想说,这要看情况。当然,“nnz”的意图比逻辑的“sum”更透明。但是,当需要压缩最后一点性能以实现“一次写入即丢弃”时,有时默默无闻是可以接受的。我相信性能差异是由于“nnz”在增加计数器之前实际上将每个元素与零进行比较,而“sum”盲目地求和。此外,我的旧版本可能会失去在执行比较之前将逻辑转换为双精度的补充时间。但是,当然,这只是猜测...... (2认同)