【问题标题】:Difference between MATLAB's numel and length functionsMATLAB的numel和length函数的区别
【发布时间】:2011-03-08 09:04:37
【问题描述】:

我知道 length(x) 返回 max(size(x))numel(x) 返回 x 的元素总数,但是对于 1 x n 数组,哪个更好?这是否重要,或者在这种情况下它们可以互换?

编辑:只是为了好玩:

在达到 100k 个元素之前,它们的性能似乎相同。

【问题讨论】:

    标签: arrays matlab microbenchmark


    【解决方案1】:

    对于 1×N 数组,它们本质上是相同的。对于多维数组M,它们可以给出不同的结果:

    • numel(M) 等价于 prod(size(M))
    • length(M) 等价于 max(size(M))。如果M 为空(即任意维度为0),则length(M) 为0。

    【讨论】:

    • 请注意,如果 x = one(0,n);然后 max(size(x)) --> n while length(x) --> 0
    【解决方案2】:

    在这种情况下,它们返回相同并且没有区别。在性能方面,它取决于 MATLAB 中数组的内部工作。例如。如果有关于数组中有多少元素的元信息(无论形状如何),那么 numel 尽可能快,而 max(size(x)) 似乎需要更多的工作才能获得相同的东西(检索大小和然后找到其中的最大值)。在那种情况下我习惯使用numel,但除了表演演讲(假设),我会说它们是可以互换的。

    【讨论】:

    • 你在性能部分是对的。我刚刚在 x=1:100000000 上运行了 100 次 numel vs length 迭代,并且 numel 平均快了 3.0919 倍。不过,对于较小的数组来说应该没什么大不了的。
    • ...现在我真的很好奇 numel/length 与数组大小的性能。
    • LENGTH 永远不会成为您程序的性能瓶颈!只有真正的性能改进很重要。对于所有其他情况,代码可读性很重要。
    • @Mikhail 视情况而定。第一个优化是写一个更好的算法,但是避免无用的操作可以帮助 if 更快;当然,没有理由优化任何执行一次的代码。 (感谢 Doresoom 的测试,我只是对事情的发展做了一个假设)。对于 1xN 数组,我发现 numel 可读为 length(实际上我发现 numel 在可用时更具表现力,但它是主观的)
    【解决方案3】:

    正如其他人所说,它们对于一维数组是相同的。

    恕我直言,从代码可读性的角度来看length 应该用于一维数组。这是关于"intentional programming",你看到代码并理解程序员在构思他的工作时的想法。所以当我看到numel 时,我就知道它是用在矩阵上的。

    lengthnumel 是我们团队多年来的讨论话题。前高级开发人员不关心代码的可重复性,只关心正在完成的工作,并且只在 numel 中使用,否则代码可读性/格式不佳。另一个人是数学家,仅在数字数组上使用length,对他来说是“真实”数组。对于元胞数组和结构体数组,他使用numel

    【讨论】:

    • 良好的视角 - 在一分钟内增加了可读性/性能提升微不足道。 +1
    • 当我看到 NUMEL 被使用时,我不认为它被用于矩阵而不是向量,我只是假设它被用于尺寸不重要的对象,只有元素数量很重要。
    • 当您要重构该代码并且乍一看不知道它是向量还是矩阵时,这很重要!
    • 我认为应该是变量名来指示对象是向量还是矩阵,而不是在其上使用NUMEL还是LENGTH。
    • 我能说什么,我就是这么懒 ;) 开玩笑的,尽管微优化通常不值得,但我相信@ShinTakezou 在 MATLAB 的矩阵内部结构中可能有一个有效点将元素的数量存储为元信息;我遇到了一篇有趣但旧的新闻组帖子,它研究了extern\include\matrix.h 中的mxArray 结构:groups.google.com/group/comp.soft-sys.matlab/browse_thread/…
    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2013-09-29
    • 2013-04-22
    • 2014-01-08
    • 2016-04-07
    相关资源
    最近更新 更多