MATLAB的numel和length函数的区别

41

我知道length(x)返回x的最大尺寸,而numel(x)返回x中元素的总数,但对于一个1x n的数组,哪个更好呢?它们在这种情况下是否可以互换?

编辑:只是为了好玩:

alt text

看起来它们在性能上是相同的,直到你有100k个元素。

3个回答

22

对于一个长度为N的一维数组,它们本质上是相同的。但对于一个多维数组M,它们可能会给出不同的结果:

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

5
注意,如果x = ones(0,n); 则max(size(x)) --> n,而length(x) --> 0。 (翻译:当x为一个长度为0、元素全为1的行向量时,使用max(size(x))函数会返回n,而length(x)函数会返回0。) - brown.2179

19

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


5
你说得对,就性能方面而言。我刚刚在 x=1:100000000 上运行了 100 次 numel 和 length 的测试,结果发现 numel 平均快了 3.0919 倍。不过对于较小的数组来说,这可能影响不大。 - Doresoom
现在我实际上对 numel/length 的性能与数组大小相比很感兴趣。 - Doresoom
8
在你的程序中,长度永远不会成为性能瓶颈!只有真正的性能改进才是重要的。对于其他情况,代码可读性很重要。 - Mikhail Poda
1
@Mikhail 这取决于情况。首先优化的是编写更好的算法,但避免不必要的操作也可以帮助提高速度;当然,没有理由去优化只执行一次的任何代码。(感谢 Doresoom 的测试,我只是对事情可能会变成什么做了一个假设)。我发现 numel 对于 1xN 数组可读性较高(的确,我发现当可用时 numel 更富有表现力,但这是主观的)。 - ShinTakezou

13

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

在我的观点中,从代码可读性的角度来看,应该在一维数组上使用length。这是关于“意图编程”的问题,您可以查看代码并理解程序员在构思他的工作时想要表达的内容。因此,当我看到numel时,我知道它用于矩阵。

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


2
好的观点-相对于微小的性能提升,阅读性更佳。+1 - Doresoom
7
当我看到使用 NUMEL,我不会假设它是用于矩阵还是向量,我只会假设它是用于一个维度不重要、仅需要元素数量的对象。 - gnovice
5
我认为应该用变量名来指示一个对象是向量还是矩阵,而不是使用NUMEL或LENGTH来判断。 - gnovice
2
我能说什么呢,我就是这么懒 ;) 开玩笑,虽然微优化通常不值得,但我认为@ShinTakezou有一个有效的观点,即MATLAB的矩阵内部结构可能将元素数量存储为元信息;我发现了一个有趣但旧的新闻组帖子,研究了extern\include\matrix.h中找到的mxArray结构:http://groups.google.com/group/comp.soft-sys.matlab/browse_thread/thread/c241d8821fb90275 - Amro
在大多数情况下,您不应该需要知道变量是向量还是矩阵。即使您目前只考虑了一个向量,您的代码也应该像处理矩阵输入一样运行 - 无论是沿着特定维度操作、逐元素操作,还是因为行为未定义而失败。如果您重构代码,更有可能改变变量维度的假设,而不是传播旧的假设。 - Will
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接