gpt4 book ai didi

arrays - 重复数组元素 : Run-length decoding in MATLAB 的副本

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

我正在尝试使用“值”数组和“计数器”数组将多个值插入到数组中。例如,如果:

a=[1,3,2,5]
b=[2,2,1,3]

我想要一些函数的输出
c=somefunction(a,b)

成为
c=[1,1,3,3,2,5,5,5]

其中 a(1) 重复 b(1) 次,a(2) 重复 b(2) 次,等等......

MATLAB 中是否有内置函数可以执行此操作?如果可能,我想避免使用 for 循环。我已经尝试了 'repmat()' 和 'kron()' 的变体,但无济于事。

这基本上是 Run-length encoding .

最佳答案

基准

为 R2015b 更新 :repelem现在对于所有数据大小都是最快的。

测试功能:

  • MATLAB 内置 repelem R2015a 中添加的功能
  • 新手的cumsum解决方案 ( rld_cumsum )
  • Divakar 的 cumsum + diff解决方案 ( rld_cumsum_diff )
  • knedlsepp的accumarray来自 knedlsepp5cumsumaccumarray 的解决方案 ( this post )
  • 基于简单循环的实现 ( naive_jit_test.m ) 来测试即时编译器

  • test_rld.m 的结果在 R2015 b :

    repelem time

    使用 R2015 的旧时序图 here .

    调查结果 :
  • repelem总是最快的,大约是 2 倍。
  • rld_cumsum_diff始终比 rld_cumsum 快.
  • repelem对于小数据大小(少于大约 300-500 个元素)速度最快
  • rld_cumsum_diff变得明显快于 repelem大约 5 000 个元素
  • repelem变得比 rld_cumsum 慢介于 30 000 和 300 000 个元素之间的某处
  • rld_cumsumknedlsepp5cumsumaccumarray 的性能大致相同
  • naive_jit_test.m具有几乎恒定的速度,与 rld_cumsum 相当和 knedlsepp5cumsumaccumarray对于较小的尺寸,对于大尺寸的速度稍快

  • enter image description here

    使用 R2015 的旧费率图 here .

    结论

    使用 repelem低于大约 5 000 个元素和 cumsum + diff上面的解决方案。

    关于arrays - 重复数组元素 : Run-length decoding in MATLAB 的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975772/

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